/*
<: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 <bcmolt_api.h>
#include <bcmcli.h>
#include <bcmolt_model_types.h>
#include <bcm_api_cli_helpers.h>
#include "bcm_api_cli_handlers.h"

bcmcli_session *apicli_cli_log_session = NULL;

typedef struct
{
    uint8_t *start;
    uint32_t used;
    bcmolt_msg_set *msg_set;    /* used for multi-object get messages */
} apicli_byte_pool;

/* only store 1 message set at a time so it's easy to clean up after */
static bcmos_errno apicli_byte_pool_create(apicli_byte_pool *buf)
{
    buf->used = 0;
    buf->start = bcmos_calloc(APICLI_DYNAMIC_LIST_BUFFER_SIZE);
    buf->msg_set = NULL;
    return (buf->start == NULL) ? BCM_ERR_NOMEM : BCM_ERR_OK;
}

static void apicli_byte_pool_destroy(apicli_byte_pool *buf)
{
    if (buf->msg_set != NULL)
    {
        bcmolt_msg_set_free(buf->msg_set);
    }

    bcmos_free(buf->start);
}

static void *apicli_byte_pool_calloc(apicli_byte_pool *buf, uint32_t num_bytes)
{
    void *ret;
    if (buf->used + num_bytes > APICLI_DYNAMIC_LIST_BUFFER_SIZE)
    {
        return NULL;
    }

    ret = buf->start + buf->used;
    buf->used += num_bytes;
    memset(ret, 0, num_bytes);
    return ret;
}

static bcmos_errno apicli_msg_set_alloc(apicli_byte_pool *buf, bcmolt_obj_id obj, bcmolt_mgt_group group, uint32_t max_instances, bcmolt_msg_set **msg_set)
{
    bcmos_errno err;
    if (buf->msg_set != NULL)
    {
        return BCM_ERR_NOMEM;   /* only one at a time */
    }

    err = bcmolt_msg_set_alloc(obj, group, max_instances, &buf->msg_set);
    *msg_set = buf->msg_set;
    return err;
}

/*
 * Start/end banners - these are specially formatted so listening apps can easily tell where API handling starts/ends.
 */
static void apicli_print_start(bcmcli_session *session, const char *api_name)
{
    bcmcli_print(session, "[-- API Start: %s --]\n", api_name);
}

static void apicli_print_data_start(bcmcli_session *session)
{
    bcmcli_print(session, "[-- API Message Data --]\n");
}

static void 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 apicli_cli_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 apicli_log_prop_val(bcmolt_obj_id obj, bcmolt_mgt_group group, uint16_t subgroup, uint16_t prop, void *value)
{
    bcmos_errno err;
    const bcmcli_prop_descr *prop_descr;

    if (apicli_cli_log_session == NULL)
    {
        static bcmcli_session_parm session_params = { .write = apicli_cli_session_write_cb };

        err = bcmcli_session_open(&session_params, &apicli_cli_log_session);
        if (err != BCM_ERR_OK)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error opening session: %s", bcmos_strerror(err));
            return;
        }
    }

    err = api_cli_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 = apicli_dump_prop_initializer(apicli_cli_log_session, prop_descr, value);
    if (err != BCM_ERR_OK)
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error printing property: %s", bcmos_strerror(err));
    }
}

static bcmos_ipv4_address apicli_unumber_to_ipv4(uint32_t num)
{
    bcmos_ipv4_address ip;
    ip.u32 = num;
    return ip;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_ae_ni_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_ae_ni_cfg cfg;       /**< declare main API struct */
    bcmolt_ae_ni_key key = { }; /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_ae_ni_cfg cfg;\n");
    bcmcli_log("bcmolt_ae_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "ae_ni");
    if (cli_parm != NULL)
    {
        key.ae_ni = (bcmolt_ae_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "ae_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.ae_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_AE_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_AE_NI_KEY_ID_AE_NI, &key.ae_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, ae_ni, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, ae_ni, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "mac_address");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, ae_ni, mac_address);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, ae_ni, mac_address);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "ae_ni_en");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, ae_ni, ae_ni_en);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, ae_ni, ae_ni_en);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "mtu_10g");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, ae_ni, mtu_10g);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, ae_ni, mtu_10g);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "prbs_generator");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, ae_ni, prbs_generator);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, ae_ni, prbs_generator);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "prbs_checker");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, ae_ni, prbs_checker);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, ae_ni, prbs_checker);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "prbs_status");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, ae_ni, prbs_status);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, ae_ni, prbs_status);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_CFG_PROP_IS_SET(&cfg, ae_ni, mac_address) && !BCMOLT_CFG_PROP_IS_SET(&cfg, ae_ni, ae_ni_en) && !BCMOLT_CFG_PROP_IS_SET(&cfg, ae_ni, mtu_10g) && !BCMOLT_CFG_PROP_IS_SET(&cfg, ae_ni, prbs_generator) && !BCMOLT_CFG_PROP_IS_SET(&cfg, ae_ni, prbs_checker) && !BCMOLT_CFG_PROP_IS_SET(&cfg, ae_ni, prbs_status))
    {
        BCMOLT_CFG_PROP_GET(&cfg, ae_ni, all_properties);
        bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, ae_ni, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_get(device_id, &cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_ae_ni_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_ae_ni_cfg cfg;       /**< declare main API struct */
    bcmolt_ae_ni_key key = { }; /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_ae_ni_cfg cfg;\n");
    bcmcli_log("bcmolt_ae_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "ae_ni");
    if (cli_parm != NULL)
    {
        key.ae_ni = (bcmolt_ae_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "ae_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.ae_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_AE_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_AE_NI_KEY_ID_AE_NI, &key.ae_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, ae_ni, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, ae_ni, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "mac_address");
    if (cli_parm != NULL)
    {
        bcmos_mac_address val;
        val = cli_parm->value.mac;
        BCMOLT_CFG_PROP_SET(&cfg, ae_ni, mac_address, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, ae_ni, mac_address, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_AE_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_AE_NI_CFG_ID_MAC_ADDRESS, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "mtu_10g");
    if (cli_parm != NULL)
    {
        uint16_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, ae_ni, mtu_10g, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, ae_ni, mtu_10g, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_AE_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_AE_NI_CFG_ID_MTU_10G, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "prbs_generator.");
    if (cli_parm != NULL)
    {
        bcmolt_prbs_generator_config val = { };
        cli_parm = bcmcli_find_named_parm(session, "prbs_generator.polynom");
        if (cli_parm != NULL)
        {
            val.polynom = (bcmolt_prbs_polynomial) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "prbs_generator.polynom is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "prbs_generator.error_insert");
        if (cli_parm != NULL)
        {
            val.error_insert = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "prbs_generator.error_insert is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "prbs_generator.invert");
        if (cli_parm != NULL)
        {
            val.invert = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "prbs_generator.invert is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "prbs_generator.control");
        if (cli_parm != NULL)
        {
            val.control = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "prbs_generator.control is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, ae_ni, prbs_generator, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_prbs_generator_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_AE_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_AE_NI_CFG_ID_PRBS_GENERATOR, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, ae_ni, prbs_generator, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "prbs_checker.");
    if (cli_parm != NULL)
    {
        bcmolt_prbs_checker_config val = { };
        cli_parm = bcmcli_find_named_parm(session, "prbs_checker.polynom");
        if (cli_parm != NULL)
        {
            val.polynom = (bcmolt_prbs_polynomial) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "prbs_checker.polynom is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "prbs_checker.mode");
        if (cli_parm != NULL)
        {
            val.mode = (bcmolt_prbs_checker_mode) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "prbs_checker.mode is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "prbs_checker.data_invert");
        if (cli_parm != NULL)
        {
            val.data_invert = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "prbs_checker.data_invert is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "prbs_checker.control");
        if (cli_parm != NULL)
        {
            val.control = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "prbs_checker.control is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, ae_ni, prbs_checker, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_prbs_checker_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_AE_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_AE_NI_CFG_ID_PRBS_CHECKER, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, ae_ni, prbs_checker, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_cfg_set(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_set(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_ae_ni_cfg_clear(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_ae_ni_cfg cfg;       /**< declare main API struct */
    bcmolt_ae_ni_key key = { }; /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_ae_ni_cfg cfg;\n");
    bcmcli_log("bcmolt_ae_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_clear");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "ae_ni");
    if (cli_parm != NULL)
    {
        key.ae_ni = (bcmolt_ae_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "ae_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.ae_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_AE_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_AE_NI_KEY_ID_AE_NI, &key.ae_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, ae_ni, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, ae_ni, key);\n");

    /* call API */
    err = bcmolt_cfg_clear(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_clear(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_ae_ni_cfg_get_multi(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_ae_ni_cfg cfg;           /**< declare main API struct */
    bcmolt_ae_ni_key key = { };     /**< declare key */
    bcmolt_msg_set *msg_set = NULL; /**< declare message set */
    uint32_t max_msgs;              /**< declare max number of msgs to get */
    bcmos_bool invert_filter;       /**< declare filter invert flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_ae_ni_cfg cfg;\n");
    bcmcli_log("bcmolt_ae_ni_key key = {  };\n");
    bcmcli_log("bcmolt_msg_set* msg_set = NULL;\n");
    bcmcli_log("uint32_t max_msgs;\n");
    bcmcli_log("bcmos_bool invert_filter;\n");
    apicli_print_start(session, "bcmolt_cfg_get_multi");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "ae_ni");
    if (cli_parm != NULL)
    {
        key.ae_ni = (bcmolt_ae_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "ae_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.ae_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_AE_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_AE_NI_KEY_ID_AE_NI, &key.ae_ni);
    bcmcli_log(";\n");

    /* set max number of msgs from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "max_msgs");
    if (cli_parm != NULL)
    {
        max_msgs = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "max_msgs is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("max_msgs = %d;\n", max_msgs);

    /* set filter invert flag from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "filter_invert");
    if (cli_parm != NULL)
    {
        invert_filter = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "filter_invert is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("invert_filter = %s;\n", (invert_filter) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* allocate message set */
    err = apicli_msg_set_alloc(byte_pool, BCMOLT_OBJ_ID_AE_NI, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);
    if (err != BCM_ERR_OK)
    {
        return err;
    }

    bcmcli_log("bcmolt_msg_set_alloc(BCMOLT_OBJ_ID_AE_NI, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, ae_ni, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, ae_ni, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "filter.mac_address");
    if (cli_parm != NULL)
    {
        bcmos_mac_address val;
        val = cli_parm->value.mac;
        BCMOLT_CFG_PROP_SET(&cfg, ae_ni, mac_address, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, ae_ni, mac_address, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_AE_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_AE_NI_CFG_ID_MAC_ADDRESS, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "mac_address");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, ae_ni, mac_address);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, ae_ni, mac_address);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.ae_ni_en");
    if (cli_parm != NULL)
    {
        bcmolt_ae_ni_en_state val;
        val = (bcmolt_ae_ni_en_state) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, ae_ni, ae_ni_en, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, ae_ni, ae_ni_en, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_AE_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_AE_NI_CFG_ID_AE_NI_EN, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "ae_ni_en");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, ae_ni, ae_ni_en);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, ae_ni, ae_ni_en);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.mtu_10g");
    if (cli_parm != NULL)
    {
        uint16_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, ae_ni, mtu_10g, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, ae_ni, mtu_10g, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_AE_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_AE_NI_CFG_ID_MTU_10G, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "mtu_10g");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, ae_ni, mtu_10g);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, ae_ni, mtu_10g);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.prbs_generator.");
    if (cli_parm != NULL)
    {
        bcmolt_prbs_generator_config val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_generator.polynom");
        if (cli_parm != NULL)
        {
            val.polynom = (bcmolt_prbs_polynomial) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_generator.polynom is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_generator.error_insert");
        if (cli_parm != NULL)
        {
            val.error_insert = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_generator.error_insert is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_generator.invert");
        if (cli_parm != NULL)
        {
            val.invert = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_generator.invert is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_generator.control");
        if (cli_parm != NULL)
        {
            val.control = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_generator.control is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, ae_ni, prbs_generator, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_prbs_generator_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_AE_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_AE_NI_CFG_ID_PRBS_GENERATOR, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, ae_ni, prbs_generator, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "prbs_generator");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, ae_ni, prbs_generator);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, ae_ni, prbs_generator);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.prbs_checker.");
    if (cli_parm != NULL)
    {
        bcmolt_prbs_checker_config val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_checker.polynom");
        if (cli_parm != NULL)
        {
            val.polynom = (bcmolt_prbs_polynomial) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_checker.polynom is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_checker.mode");
        if (cli_parm != NULL)
        {
            val.mode = (bcmolt_prbs_checker_mode) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_checker.mode is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_checker.data_invert");
        if (cli_parm != NULL)
        {
            val.data_invert = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_checker.data_invert is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_checker.control");
        if (cli_parm != NULL)
        {
            val.control = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_checker.control is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, ae_ni, prbs_checker, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_prbs_checker_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_AE_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_AE_NI_CFG_ID_PRBS_CHECKER, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, ae_ni, prbs_checker, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "prbs_checker");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, ae_ni, prbs_checker);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, ae_ni, prbs_checker);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.prbs_status.");
    if (cli_parm != NULL)
    {
        bcmolt_prbs_status val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_status.lock_state");
        if (cli_parm != NULL)
        {
            val.lock_state = (bcmolt_prbs_lock_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_status.lock_state is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_status.error_counts");
        if (cli_parm != NULL)
        {
            val.error_counts = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_status.error_counts is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, ae_ni, prbs_status, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_prbs_status val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_AE_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_AE_NI_CFG_ID_PRBS_STATUS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, ae_ni, prbs_status, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "prbs_status");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, ae_ni, prbs_status);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, ae_ni, prbs_status);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, ae_ni, mac_address) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, ae_ni, ae_ni_en) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, ae_ni, mtu_10g) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, ae_ni, prbs_generator) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, ae_ni, prbs_checker) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, ae_ni, prbs_status))
    {
        BCMOLT_MSGSET_CFG_PROP_GET(msg_set, ae_ni, all_properties);
        bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, ae_ni, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);
    bcmcli_log("bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_ae_ni_oper_set_ae_ni_en_state_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_ae_ni_set_ae_ni_en_state oper;   /**< declare main API struct */
    bcmolt_ae_ni_key key = { };             /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_ae_ni_set_ae_ni_en_state oper;\n");
    bcmcli_log("bcmolt_ae_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "ae_ni");
    if (cli_parm != NULL)
    {
        key.ae_ni = (bcmolt_ae_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "ae_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.ae_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_AE_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_AE_NI_KEY_ID_AE_NI, &key.ae_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, ae_ni, set_ae_ni_en_state, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, ae_ni, set_ae_ni_en_state, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "new_state");
    if (cli_parm != NULL)
    {
        bcmolt_ae_ni_en_state val;
        val = (bcmolt_ae_ni_en_state) cli_parm->value.enum_val;
        BCMOLT_OPER_PROP_SET(&oper, ae_ni, set_ae_ni_en_state, new_state, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, ae_ni, set_ae_ni_en_state, new_state, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_AE_NI, BCMOLT_MGT_GROUP_OPER, BCMOLT_AE_NI_OPER_ID_SET_AE_NI_EN_STATE, BCMOLT_AE_NI_SET_AE_NI_EN_STATE_ID_NEW_STATE, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_ae_path_ds_stat_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_ae_path_ds_stat stat;        /**< declare main API struct */
    bcmolt_ae_path_ds_key key = { };    /**< declare key */
    bcmos_bool clear_on_read;           /**< declare 'clear on read' flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_ae_path_ds_stat stat;\n");
    bcmcli_log("bcmolt_ae_path_ds_key key = {  };\n");
    bcmcli_log("bcmos_bool clear_on_read;\n");
    apicli_print_start(session, "bcmolt_stat_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "ae_ni");
    if (cli_parm != NULL)
    {
        key.ae_ni = (bcmolt_ae_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "ae_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.ae_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_AE_PATH_DS, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_AE_PATH_DS_KEY_ID_AE_NI, &key.ae_ni);
    bcmcli_log(";\n");

    /* set stat flags from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "clear");
    if (cli_parm != NULL)
    {
        clear_on_read = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "clear is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("clear_on_read = %s;\n", (clear_on_read) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* init the API struct */
    BCMOLT_STAT_INIT(&stat, ae_path_ds, key);
    bcmcli_log("BCMOLT_STAT_INIT(&stat, ae_path_ds, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "bytes");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, ae_path_ds, bytes);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, ae_path_ds, bytes);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, ae_path_ds, frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, ae_path_ds, frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_64");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, ae_path_ds, frames_64);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, ae_path_ds, frames_64);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_65_127");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, ae_path_ds, frames_65_127);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, ae_path_ds, frames_65_127);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_128_255");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, ae_path_ds, frames_128_255);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, ae_path_ds, frames_128_255);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_256_511");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, ae_path_ds, frames_256_511);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, ae_path_ds, frames_256_511);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_512_1023");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, ae_path_ds, frames_512_1023);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, ae_path_ds, frames_512_1023);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_1024_1518");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, ae_path_ds, frames_1024_1518);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, ae_path_ds, frames_1024_1518);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_1519_2047");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, ae_path_ds, frames_1519_2047);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, ae_path_ds, frames_1519_2047);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_2048_4095");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, ae_path_ds, frames_2048_4095);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, ae_path_ds, frames_2048_4095);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_4096_9216");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, ae_path_ds, frames_4096_9216);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, ae_path_ds, frames_4096_9216);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_9217_16383");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, ae_path_ds, frames_9217_16383);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, ae_path_ds, frames_9217_16383);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "broadcast_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, ae_path_ds, broadcast_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, ae_path_ds, broadcast_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "data_bytes");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, ae_path_ds, data_bytes);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, ae_path_ds, data_bytes);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "multicast_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, ae_path_ds, multicast_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, ae_path_ds, multicast_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "unicast_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, ae_path_ds, unicast_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, ae_path_ds, unicast_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "abort_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, ae_path_ds, abort_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, ae_path_ds, abort_frames);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_STAT_PROP_IS_SET(&stat, ae_path_ds, bytes) && !BCMOLT_STAT_PROP_IS_SET(&stat, ae_path_ds, frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, ae_path_ds, frames_64) && !BCMOLT_STAT_PROP_IS_SET(&stat, ae_path_ds, frames_65_127) && !BCMOLT_STAT_PROP_IS_SET(&stat, ae_path_ds, frames_128_255) && !BCMOLT_STAT_PROP_IS_SET(&stat, ae_path_ds, frames_256_511) && !BCMOLT_STAT_PROP_IS_SET(&stat, ae_path_ds, frames_512_1023) && !BCMOLT_STAT_PROP_IS_SET(&stat, ae_path_ds, frames_1024_1518) && !BCMOLT_STAT_PROP_IS_SET(&stat, ae_path_ds, frames_1519_2047) && !BCMOLT_STAT_PROP_IS_SET(&stat, ae_path_ds, frames_2048_4095) && !BCMOLT_STAT_PROP_IS_SET(&stat, ae_path_ds, frames_4096_9216) && !BCMOLT_STAT_PROP_IS_SET(&stat, ae_path_ds, frames_9217_16383) && !BCMOLT_STAT_PROP_IS_SET(&stat, ae_path_ds, broadcast_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, ae_path_ds, data_bytes) && !BCMOLT_STAT_PROP_IS_SET(&stat, ae_path_ds, multicast_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, ae_path_ds, unicast_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, ae_path_ds, abort_frames))
    {
        BCMOLT_STAT_PROP_GET(&stat, ae_path_ds, all_properties);
        bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, ae_path_ds, all_properties);\n");
    }

    /* call API */
    err = bcmolt_stat_get(device_id, &stat.hdr, clear_on_read);
    bcmcli_log("bcmolt_stat_get(device_id, &stat.hdr, clear_on_read);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &stat.hdr.hdr);
    }

    apicli_print_complete(session, err, stat.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_ae_path_ds_stat_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_ae_path_ds_stat_cfg stat_cfg;    /**< declare main API struct */
    bcmolt_ae_path_ds_key key = { };        /**< declare key */
    bcmolt_ae_path_ds_stat_id stat_id;      /**< declare stat ID */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_ae_path_ds_stat_cfg stat_cfg;\n");
    bcmcli_log("bcmolt_ae_path_ds_key key = {  };\n");
    apicli_print_start(session, "bcmolt_stat_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "ae_ni");
    if (cli_parm != NULL)
    {
        key.ae_ni = (bcmolt_ae_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "ae_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.ae_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_AE_PATH_DS, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_AE_PATH_DS_KEY_ID_AE_NI, &key.ae_ni);
    bcmcli_log(";\n");

    /* set stat ID from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "sub");
    if (cli_parm != NULL)
    {
        stat_id = (bcmolt_ae_path_ds_stat_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
        return BCM_ERR_PARM;
    }

    /* init the API struct */
    switch (stat_id)
    {
        case BCMOLT_AE_PATH_DS_STAT_ID_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, bytes, key);\n");
            break;
        case BCMOLT_AE_PATH_DS_STAT_ID_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, frames, key);\n");
            break;
        case BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_64:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, frames_64, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, frames_64, key);\n");
            break;
        case BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_65_127:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, frames_65_127, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, frames_65_127, key);\n");
            break;
        case BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_128_255:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, frames_128_255, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, frames_128_255, key);\n");
            break;
        case BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_256_511:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, frames_256_511, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, frames_256_511, key);\n");
            break;
        case BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_512_1023:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, frames_512_1023, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, frames_512_1023, key);\n");
            break;
        case BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_1024_1518:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, frames_1024_1518, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, frames_1024_1518, key);\n");
            break;
        case BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_1519_2047:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, frames_1519_2047, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, frames_1519_2047, key);\n");
            break;
        case BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_2048_4095:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, frames_2048_4095, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, frames_2048_4095, key);\n");
            break;
        case BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_4096_9216:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, frames_4096_9216, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, frames_4096_9216, key);\n");
            break;
        case BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_9217_16383:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, frames_9217_16383, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, frames_9217_16383, key);\n");
            break;
        case BCMOLT_AE_PATH_DS_STAT_ID_BROADCAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, broadcast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, broadcast_frames, key);\n");
            break;
        case BCMOLT_AE_PATH_DS_STAT_ID_DATA_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, data_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, data_bytes, key);\n");
            break;
        case BCMOLT_AE_PATH_DS_STAT_ID_MULTICAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, multicast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, multicast_frames, key);\n");
            break;
        case BCMOLT_AE_PATH_DS_STAT_ID_UNICAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, unicast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, unicast_frames, key);\n");
            break;
        case BCMOLT_AE_PATH_DS_STAT_ID_ABORT_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, abort_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, abort_frames, key);\n");
            break;
        default:
            apicli_print_complete(session, BCM_ERR_RANGE, "\n");
            return BCM_ERR_RANGE;
    }

    /* call API */
    err = bcmolt_stat_cfg_get(device_id, &stat_cfg.hdr);
    bcmcli_log("bcmolt_stat_cfg_get(device_id, &stat_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &stat_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, stat_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_ae_path_ds_stat_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_ae_path_ds_stat_cfg stat_cfg;    /**< declare main API struct */
    bcmolt_ae_path_ds_key key = { };        /**< declare key */
    bcmolt_ae_path_ds_stat_id stat_id;      /**< declare stat ID */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_ae_path_ds_stat_cfg stat_cfg;\n");
    bcmcli_log("bcmolt_ae_path_ds_key key = {  };\n");
    apicli_print_start(session, "bcmolt_stat_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "ae_ni");
    if (cli_parm != NULL)
    {
        key.ae_ni = (bcmolt_ae_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "ae_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.ae_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_AE_PATH_DS, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_AE_PATH_DS_KEY_ID_AE_NI, &key.ae_ni);
    bcmcli_log(";\n");

    /* set stat ID from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "sub");
    if (cli_parm != NULL)
    {
        stat_id = (bcmolt_ae_path_ds_stat_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
        return BCM_ERR_PARM;
    }

    /* init the API struct */
    switch (stat_id)
    {
        case BCMOLT_AE_PATH_DS_STAT_ID_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, bytes, key);\n");
            break;
        case BCMOLT_AE_PATH_DS_STAT_ID_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, frames, key);\n");
            break;
        case BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_64:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, frames_64, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, frames_64, key);\n");
            break;
        case BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_65_127:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, frames_65_127, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, frames_65_127, key);\n");
            break;
        case BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_128_255:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, frames_128_255, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, frames_128_255, key);\n");
            break;
        case BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_256_511:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, frames_256_511, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, frames_256_511, key);\n");
            break;
        case BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_512_1023:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, frames_512_1023, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, frames_512_1023, key);\n");
            break;
        case BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_1024_1518:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, frames_1024_1518, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, frames_1024_1518, key);\n");
            break;
        case BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_1519_2047:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, frames_1519_2047, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, frames_1519_2047, key);\n");
            break;
        case BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_2048_4095:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, frames_2048_4095, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, frames_2048_4095, key);\n");
            break;
        case BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_4096_9216:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, frames_4096_9216, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, frames_4096_9216, key);\n");
            break;
        case BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_9217_16383:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, frames_9217_16383, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, frames_9217_16383, key);\n");
            break;
        case BCMOLT_AE_PATH_DS_STAT_ID_BROADCAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, broadcast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, broadcast_frames, key);\n");
            break;
        case BCMOLT_AE_PATH_DS_STAT_ID_DATA_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, data_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, data_bytes, key);\n");
            break;
        case BCMOLT_AE_PATH_DS_STAT_ID_MULTICAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, multicast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, multicast_frames, key);\n");
            break;
        case BCMOLT_AE_PATH_DS_STAT_ID_UNICAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, unicast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, unicast_frames, key);\n");
            break;
        case BCMOLT_AE_PATH_DS_STAT_ID_ABORT_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, abort_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_ds, abort_frames, key);\n");
            break;
        default:
            apicli_print_complete(session, BCM_ERR_RANGE, "\n");
            return BCM_ERR_RANGE;
    }

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.");
    if (cli_parm != NULL)
    {
        bcmolt_stat_alarm_config val = { };
        cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.trigger.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.type");
            if (cli_parm != NULL)
            {
                val.trigger.type = (bcmolt_stat_condition_type) cli_parm->value.enum_val;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.type is not set\n");
                return BCM_ERR_PARM;
            }

            switch (val.trigger.type)
            {
                case BCMOLT_STAT_CONDITION_TYPE_RATE_THRESHOLD:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.rising");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_threshold.rising = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.rising is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.falling");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_threshold.falling = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.falling is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_RATE_RANGE:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.upper");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_range.upper = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.upper is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.lower");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_range.lower = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.lower is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_VALUE_THRESHOLD:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.limit");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.value_threshold.limit = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.limit is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_NONE:
                    break;
                default:
                    apicli_print_complete(session, BCM_ERR_RANGE, "\n");
                    return BCM_ERR_RANGE;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.soak.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "cfg.soak.active_soak_time");
            if (cli_parm != NULL)
            {
                val.soak.active_soak_time = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak.active_soak_time is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "cfg.soak.clear_soak_time");
            if (cli_parm != NULL)
            {
                val.soak.clear_soak_time = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak.clear_soak_time is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_STAT_CFG_PROP_SET(&stat_cfg, ae_path_ds, cfg, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_stat_alarm_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_AE_PATH_DS, BCMOLT_MGT_GROUP_STAT_CFG, 0, BCMOLT_AE_PATH_DS_STAT_CFG_ID_CFG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_STAT_CFG_PROP_SET(&stat_cfg, ae_path_ds, cfg, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_stat_cfg_set(device_id, &stat_cfg.hdr);
    bcmcli_log("bcmolt_stat_cfg_set(device_id, &stat_cfg.hdr);\n");
    apicli_print_complete(session, err, stat_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_ae_path_ds_auto_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_ae_path_ds_auto_cfg auto_cfg;    /**< declare main API struct */
    bcmolt_ae_path_ds_key key = { };        /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_ae_path_ds_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_ae_path_ds_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_get");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, ae_path_ds, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, ae_path_ds, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_cleared");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, ae_path_ds, stat_alarm_cleared);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, ae_path_ds, stat_alarm_cleared);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_raised");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, ae_path_ds, stat_alarm_raised);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, ae_path_ds, stat_alarm_raised);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, ae_path_ds, stat_alarm_cleared) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, ae_path_ds, stat_alarm_raised))
    {
        BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, ae_path_ds, all_properties);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, ae_path_ds, all_properties);\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &auto_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_ae_path_ds_auto_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_ae_path_ds_auto_cfg auto_cfg;    /**< declare main API struct */
    bcmolt_ae_path_ds_key key = { };        /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_ae_path_ds_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_ae_path_ds_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_set");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, ae_path_ds, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, ae_path_ds, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_cleared");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, ae_path_ds, stat_alarm_cleared, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, ae_path_ds, stat_alarm_cleared, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_AE_PATH_DS, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_AE_PATH_DS_AUTO_CFG_ID_STAT_ALARM_CLEARED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_raised");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, ae_path_ds, stat_alarm_raised, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, ae_path_ds, stat_alarm_raised, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_AE_PATH_DS, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_AE_PATH_DS_AUTO_CFG_ID_STAT_ALARM_RAISED, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);\n");
    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_ae_path_us_stat_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_ae_path_us_stat stat;        /**< declare main API struct */
    bcmolt_ae_path_us_key key = { };    /**< declare key */
    bcmos_bool clear_on_read;           /**< declare 'clear on read' flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_ae_path_us_stat stat;\n");
    bcmcli_log("bcmolt_ae_path_us_key key = {  };\n");
    bcmcli_log("bcmos_bool clear_on_read;\n");
    apicli_print_start(session, "bcmolt_stat_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "ae_ni");
    if (cli_parm != NULL)
    {
        key.ae_ni = (bcmolt_ae_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "ae_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.ae_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_AE_PATH_US, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_AE_PATH_US_KEY_ID_AE_NI, &key.ae_ni);
    bcmcli_log(";\n");

    /* set stat flags from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "clear");
    if (cli_parm != NULL)
    {
        clear_on_read = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "clear is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("clear_on_read = %s;\n", (clear_on_read) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* init the API struct */
    BCMOLT_STAT_INIT(&stat, ae_path_us, key);
    bcmcli_log("BCMOLT_STAT_INIT(&stat, ae_path_us, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "bytes");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, ae_path_us, bytes);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, ae_path_us, bytes);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, ae_path_us, frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, ae_path_us, frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_64");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, ae_path_us, frames_64);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, ae_path_us, frames_64);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_65_127");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, ae_path_us, frames_65_127);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, ae_path_us, frames_65_127);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_128_255");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, ae_path_us, frames_128_255);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, ae_path_us, frames_128_255);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_256_511");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, ae_path_us, frames_256_511);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, ae_path_us, frames_256_511);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_512_1023");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, ae_path_us, frames_512_1023);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, ae_path_us, frames_512_1023);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_1024_1518");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, ae_path_us, frames_1024_1518);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, ae_path_us, frames_1024_1518);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_1519_2047");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, ae_path_us, frames_1519_2047);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, ae_path_us, frames_1519_2047);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_2048_4095");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, ae_path_us, frames_2048_4095);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, ae_path_us, frames_2048_4095);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_4096_9216");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, ae_path_us, frames_4096_9216);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, ae_path_us, frames_4096_9216);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_9217_16383");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, ae_path_us, frames_9217_16383);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, ae_path_us, frames_9217_16383);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "broadcast_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, ae_path_us, broadcast_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, ae_path_us, broadcast_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "data_bytes");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, ae_path_us, data_bytes);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, ae_path_us, data_bytes);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "multicast_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, ae_path_us, multicast_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, ae_path_us, multicast_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "unicast_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, ae_path_us, unicast_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, ae_path_us, unicast_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "abort_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, ae_path_us, abort_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, ae_path_us, abort_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "fcs_error");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, ae_path_us, fcs_error);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, ae_path_us, fcs_error);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "oversize_error");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, ae_path_us, oversize_error);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, ae_path_us, oversize_error);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "runt_error");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, ae_path_us, runt_error);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, ae_path_us, runt_error);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_STAT_PROP_IS_SET(&stat, ae_path_us, bytes) && !BCMOLT_STAT_PROP_IS_SET(&stat, ae_path_us, frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, ae_path_us, frames_64) && !BCMOLT_STAT_PROP_IS_SET(&stat, ae_path_us, frames_65_127) && !BCMOLT_STAT_PROP_IS_SET(&stat, ae_path_us, frames_128_255) && !BCMOLT_STAT_PROP_IS_SET(&stat, ae_path_us, frames_256_511) && !BCMOLT_STAT_PROP_IS_SET(&stat, ae_path_us, frames_512_1023) && !BCMOLT_STAT_PROP_IS_SET(&stat, ae_path_us, frames_1024_1518) && !BCMOLT_STAT_PROP_IS_SET(&stat, ae_path_us, frames_1519_2047) && !BCMOLT_STAT_PROP_IS_SET(&stat, ae_path_us, frames_2048_4095) && !BCMOLT_STAT_PROP_IS_SET(&stat, ae_path_us, frames_4096_9216) && !BCMOLT_STAT_PROP_IS_SET(&stat, ae_path_us, frames_9217_16383) && !BCMOLT_STAT_PROP_IS_SET(&stat, ae_path_us, broadcast_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, ae_path_us, data_bytes) && !BCMOLT_STAT_PROP_IS_SET(&stat, ae_path_us, multicast_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, ae_path_us, unicast_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, ae_path_us, abort_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, ae_path_us, fcs_error) && !BCMOLT_STAT_PROP_IS_SET(&stat, ae_path_us, oversize_error) && !BCMOLT_STAT_PROP_IS_SET(&stat, ae_path_us, runt_error))
    {
        BCMOLT_STAT_PROP_GET(&stat, ae_path_us, all_properties);
        bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, ae_path_us, all_properties);\n");
    }

    /* call API */
    err = bcmolt_stat_get(device_id, &stat.hdr, clear_on_read);
    bcmcli_log("bcmolt_stat_get(device_id, &stat.hdr, clear_on_read);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &stat.hdr.hdr);
    }

    apicli_print_complete(session, err, stat.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_ae_path_us_stat_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_ae_path_us_stat_cfg stat_cfg;    /**< declare main API struct */
    bcmolt_ae_path_us_key key = { };        /**< declare key */
    bcmolt_ae_path_us_stat_id stat_id;      /**< declare stat ID */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_ae_path_us_stat_cfg stat_cfg;\n");
    bcmcli_log("bcmolt_ae_path_us_key key = {  };\n");
    apicli_print_start(session, "bcmolt_stat_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "ae_ni");
    if (cli_parm != NULL)
    {
        key.ae_ni = (bcmolt_ae_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "ae_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.ae_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_AE_PATH_US, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_AE_PATH_US_KEY_ID_AE_NI, &key.ae_ni);
    bcmcli_log(";\n");

    /* set stat ID from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "sub");
    if (cli_parm != NULL)
    {
        stat_id = (bcmolt_ae_path_us_stat_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
        return BCM_ERR_PARM;
    }

    /* init the API struct */
    switch (stat_id)
    {
        case BCMOLT_AE_PATH_US_STAT_ID_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, bytes, key);\n");
            break;
        case BCMOLT_AE_PATH_US_STAT_ID_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, frames, key);\n");
            break;
        case BCMOLT_AE_PATH_US_STAT_ID_FRAMES_64:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, frames_64, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, frames_64, key);\n");
            break;
        case BCMOLT_AE_PATH_US_STAT_ID_FRAMES_65_127:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, frames_65_127, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, frames_65_127, key);\n");
            break;
        case BCMOLT_AE_PATH_US_STAT_ID_FRAMES_128_255:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, frames_128_255, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, frames_128_255, key);\n");
            break;
        case BCMOLT_AE_PATH_US_STAT_ID_FRAMES_256_511:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, frames_256_511, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, frames_256_511, key);\n");
            break;
        case BCMOLT_AE_PATH_US_STAT_ID_FRAMES_512_1023:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, frames_512_1023, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, frames_512_1023, key);\n");
            break;
        case BCMOLT_AE_PATH_US_STAT_ID_FRAMES_1024_1518:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, frames_1024_1518, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, frames_1024_1518, key);\n");
            break;
        case BCMOLT_AE_PATH_US_STAT_ID_FRAMES_1519_2047:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, frames_1519_2047, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, frames_1519_2047, key);\n");
            break;
        case BCMOLT_AE_PATH_US_STAT_ID_FRAMES_2048_4095:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, frames_2048_4095, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, frames_2048_4095, key);\n");
            break;
        case BCMOLT_AE_PATH_US_STAT_ID_FRAMES_4096_9216:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, frames_4096_9216, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, frames_4096_9216, key);\n");
            break;
        case BCMOLT_AE_PATH_US_STAT_ID_FRAMES_9217_16383:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, frames_9217_16383, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, frames_9217_16383, key);\n");
            break;
        case BCMOLT_AE_PATH_US_STAT_ID_BROADCAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, broadcast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, broadcast_frames, key);\n");
            break;
        case BCMOLT_AE_PATH_US_STAT_ID_DATA_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, data_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, data_bytes, key);\n");
            break;
        case BCMOLT_AE_PATH_US_STAT_ID_MULTICAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, multicast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, multicast_frames, key);\n");
            break;
        case BCMOLT_AE_PATH_US_STAT_ID_UNICAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, unicast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, unicast_frames, key);\n");
            break;
        case BCMOLT_AE_PATH_US_STAT_ID_ABORT_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, abort_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, abort_frames, key);\n");
            break;
        case BCMOLT_AE_PATH_US_STAT_ID_FCS_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, fcs_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, fcs_error, key);\n");
            break;
        case BCMOLT_AE_PATH_US_STAT_ID_OVERSIZE_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, oversize_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, oversize_error, key);\n");
            break;
        case BCMOLT_AE_PATH_US_STAT_ID_RUNT_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, runt_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, runt_error, key);\n");
            break;
        default:
            apicli_print_complete(session, BCM_ERR_RANGE, "\n");
            return BCM_ERR_RANGE;
    }

    /* call API */
    err = bcmolt_stat_cfg_get(device_id, &stat_cfg.hdr);
    bcmcli_log("bcmolt_stat_cfg_get(device_id, &stat_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &stat_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, stat_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_ae_path_us_stat_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_ae_path_us_stat_cfg stat_cfg;    /**< declare main API struct */
    bcmolt_ae_path_us_key key = { };        /**< declare key */
    bcmolt_ae_path_us_stat_id stat_id;      /**< declare stat ID */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_ae_path_us_stat_cfg stat_cfg;\n");
    bcmcli_log("bcmolt_ae_path_us_key key = {  };\n");
    apicli_print_start(session, "bcmolt_stat_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "ae_ni");
    if (cli_parm != NULL)
    {
        key.ae_ni = (bcmolt_ae_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "ae_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.ae_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_AE_PATH_US, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_AE_PATH_US_KEY_ID_AE_NI, &key.ae_ni);
    bcmcli_log(";\n");

    /* set stat ID from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "sub");
    if (cli_parm != NULL)
    {
        stat_id = (bcmolt_ae_path_us_stat_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
        return BCM_ERR_PARM;
    }

    /* init the API struct */
    switch (stat_id)
    {
        case BCMOLT_AE_PATH_US_STAT_ID_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, bytes, key);\n");
            break;
        case BCMOLT_AE_PATH_US_STAT_ID_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, frames, key);\n");
            break;
        case BCMOLT_AE_PATH_US_STAT_ID_FRAMES_64:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, frames_64, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, frames_64, key);\n");
            break;
        case BCMOLT_AE_PATH_US_STAT_ID_FRAMES_65_127:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, frames_65_127, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, frames_65_127, key);\n");
            break;
        case BCMOLT_AE_PATH_US_STAT_ID_FRAMES_128_255:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, frames_128_255, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, frames_128_255, key);\n");
            break;
        case BCMOLT_AE_PATH_US_STAT_ID_FRAMES_256_511:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, frames_256_511, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, frames_256_511, key);\n");
            break;
        case BCMOLT_AE_PATH_US_STAT_ID_FRAMES_512_1023:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, frames_512_1023, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, frames_512_1023, key);\n");
            break;
        case BCMOLT_AE_PATH_US_STAT_ID_FRAMES_1024_1518:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, frames_1024_1518, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, frames_1024_1518, key);\n");
            break;
        case BCMOLT_AE_PATH_US_STAT_ID_FRAMES_1519_2047:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, frames_1519_2047, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, frames_1519_2047, key);\n");
            break;
        case BCMOLT_AE_PATH_US_STAT_ID_FRAMES_2048_4095:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, frames_2048_4095, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, frames_2048_4095, key);\n");
            break;
        case BCMOLT_AE_PATH_US_STAT_ID_FRAMES_4096_9216:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, frames_4096_9216, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, frames_4096_9216, key);\n");
            break;
        case BCMOLT_AE_PATH_US_STAT_ID_FRAMES_9217_16383:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, frames_9217_16383, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, frames_9217_16383, key);\n");
            break;
        case BCMOLT_AE_PATH_US_STAT_ID_BROADCAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, broadcast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, broadcast_frames, key);\n");
            break;
        case BCMOLT_AE_PATH_US_STAT_ID_DATA_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, data_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, data_bytes, key);\n");
            break;
        case BCMOLT_AE_PATH_US_STAT_ID_MULTICAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, multicast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, multicast_frames, key);\n");
            break;
        case BCMOLT_AE_PATH_US_STAT_ID_UNICAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, unicast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, unicast_frames, key);\n");
            break;
        case BCMOLT_AE_PATH_US_STAT_ID_ABORT_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, abort_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, abort_frames, key);\n");
            break;
        case BCMOLT_AE_PATH_US_STAT_ID_FCS_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, fcs_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, fcs_error, key);\n");
            break;
        case BCMOLT_AE_PATH_US_STAT_ID_OVERSIZE_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, oversize_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, oversize_error, key);\n");
            break;
        case BCMOLT_AE_PATH_US_STAT_ID_RUNT_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, runt_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, ae_path_us, runt_error, key);\n");
            break;
        default:
            apicli_print_complete(session, BCM_ERR_RANGE, "\n");
            return BCM_ERR_RANGE;
    }

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.");
    if (cli_parm != NULL)
    {
        bcmolt_stat_alarm_config val = { };
        cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.trigger.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.type");
            if (cli_parm != NULL)
            {
                val.trigger.type = (bcmolt_stat_condition_type) cli_parm->value.enum_val;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.type is not set\n");
                return BCM_ERR_PARM;
            }

            switch (val.trigger.type)
            {
                case BCMOLT_STAT_CONDITION_TYPE_RATE_THRESHOLD:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.rising");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_threshold.rising = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.rising is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.falling");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_threshold.falling = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.falling is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_RATE_RANGE:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.upper");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_range.upper = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.upper is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.lower");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_range.lower = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.lower is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_VALUE_THRESHOLD:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.limit");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.value_threshold.limit = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.limit is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_NONE:
                    break;
                default:
                    apicli_print_complete(session, BCM_ERR_RANGE, "\n");
                    return BCM_ERR_RANGE;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.soak.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "cfg.soak.active_soak_time");
            if (cli_parm != NULL)
            {
                val.soak.active_soak_time = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak.active_soak_time is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "cfg.soak.clear_soak_time");
            if (cli_parm != NULL)
            {
                val.soak.clear_soak_time = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak.clear_soak_time is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_STAT_CFG_PROP_SET(&stat_cfg, ae_path_us, cfg, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_stat_alarm_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_AE_PATH_US, BCMOLT_MGT_GROUP_STAT_CFG, 0, BCMOLT_AE_PATH_US_STAT_CFG_ID_CFG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_STAT_CFG_PROP_SET(&stat_cfg, ae_path_us, cfg, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_stat_cfg_set(device_id, &stat_cfg.hdr);
    bcmcli_log("bcmolt_stat_cfg_set(device_id, &stat_cfg.hdr);\n");
    apicli_print_complete(session, err, stat_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_ae_path_us_auto_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_ae_path_us_auto_cfg auto_cfg;    /**< declare main API struct */
    bcmolt_ae_path_us_key key = { };        /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_ae_path_us_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_ae_path_us_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_get");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, ae_path_us, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, ae_path_us, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_cleared");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, ae_path_us, stat_alarm_cleared);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, ae_path_us, stat_alarm_cleared);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_raised");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, ae_path_us, stat_alarm_raised);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, ae_path_us, stat_alarm_raised);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, ae_path_us, stat_alarm_cleared) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, ae_path_us, stat_alarm_raised))
    {
        BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, ae_path_us, all_properties);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, ae_path_us, all_properties);\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &auto_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_ae_path_us_auto_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_ae_path_us_auto_cfg auto_cfg;    /**< declare main API struct */
    bcmolt_ae_path_us_key key = { };        /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_ae_path_us_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_ae_path_us_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_set");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, ae_path_us, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, ae_path_us, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_cleared");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, ae_path_us, stat_alarm_cleared, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, ae_path_us, stat_alarm_cleared, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_AE_PATH_US, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_AE_PATH_US_AUTO_CFG_ID_STAT_ALARM_CLEARED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_raised");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, ae_path_us, stat_alarm_raised, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, ae_path_us, stat_alarm_raised, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_AE_PATH_US, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_AE_PATH_US_AUTO_CFG_ID_STAT_ALARM_RAISED, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);\n");
    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_channel_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_channel_cfg cfg;         /**< declare main API struct */
    bcmolt_channel_key key = { };   /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_channel_cfg cfg;\n");
    bcmcli_log("bcmolt_channel_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_pon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_CHANNEL, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_CHANNEL_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, channel, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, channel, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "operation_control");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, channel, operation_control);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, channel, operation_control);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tol");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, channel, tol);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, channel, tol);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "system_profile");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, channel, system_profile);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, channel, system_profile);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "channel_profile");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, channel, channel_profile);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, channel, channel_profile);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_CFG_PROP_IS_SET(&cfg, channel, operation_control) && !BCMOLT_CFG_PROP_IS_SET(&cfg, channel, tol) && !BCMOLT_CFG_PROP_IS_SET(&cfg, channel, system_profile) && !BCMOLT_CFG_PROP_IS_SET(&cfg, channel, channel_profile))
    {
        BCMOLT_CFG_PROP_GET(&cfg, channel, all_properties);
        bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, channel, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_get(device_id, &cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_channel_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_channel_cfg cfg;         /**< declare main API struct */
    bcmolt_channel_key key = { };   /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_channel_cfg cfg;\n");
    bcmcli_log("bcmolt_channel_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_pon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_CHANNEL, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_CHANNEL_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, channel, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, channel, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_parm_by_prefix(session, "operation_control.");
    if (cli_parm != NULL)
    {
        bcmolt_operation_control val = { };
        cli_parm = bcmcli_find_named_parm(session, "operation_control.re");
        if (cli_parm != NULL)
        {
            val.re = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "operation_control.re is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "operation_control.odn_class");
        if (cli_parm != NULL)
        {
            val.odn_class = (bcmolt_odn_class) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "operation_control.odn_class is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "operation_control.ds_fec_mode");
        if (cli_parm != NULL)
        {
            val.ds_fec_mode = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "operation_control.ds_fec_mode is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "operation_control.protocol");
        if (cli_parm != NULL)
        {
            val.protocol = (bcmolt_tc_protocol) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "operation_control.protocol is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "operation_control.ds_link_type");
        if (cli_parm != NULL)
        {
            val.ds_link_type = (bcmolt_link_type) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "operation_control.ds_link_type is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "operation_control.pon_id.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "operation_control.pon_id.administrative_label");
            if (cli_parm != NULL)
            {
                val.pon_id.administrative_label = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "operation_control.pon_id.administrative_label is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "operation_control.pon_id.dwlch_id");
            if (cli_parm != NULL)
            {
                val.pon_id.dwlch_id = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "operation_control.pon_id.dwlch_id is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "operation_control.pon_id is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "operation_control.c");
        if (cli_parm != NULL)
        {
            val.c = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "operation_control.c is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, channel, operation_control, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_operation_control val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_CHANNEL, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_CHANNEL_CFG_ID_OPERATION_CONTROL, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, channel, operation_control, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "tol");
    if (cli_parm != NULL)
    {
        uint16_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, channel, tol, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, channel, tol, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_CHANNEL, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_CHANNEL_CFG_ID_TOL, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "system_profile.");
    if (cli_parm != NULL)
    {
        bcmolt_system_profile val = { };
        cli_parm = bcmcli_find_named_parm(session, "system_profile.ng_2_sys_id");
        if (cli_parm != NULL)
        {
            val.ng_2_sys_id = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "system_profile.ng_2_sys_id is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "system_profile.version");
        if (cli_parm != NULL)
        {
            val.version = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "system_profile.version is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "system_profile.channel_spacing");
        if (cli_parm != NULL)
        {
            val.channel_spacing = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "system_profile.channel_spacing is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "system_profile.us_operating_wavelength_bands");
        if (cli_parm != NULL)
        {
            val.us_operating_wavelength_bands = (bcmolt_us_operating_wavelength_bands) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "system_profile.us_operating_wavelength_bands is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "system_profile.us_mse");
        if (cli_parm != NULL)
        {
            val.us_mse = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "system_profile.us_mse is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "system_profile.loose_calibration_bound");
        if (cli_parm != NULL)
        {
            val.loose_calibration_bound = (bcmolt_calibration_record) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "system_profile.loose_calibration_bound is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "system_profile.fsr");
        if (cli_parm != NULL)
        {
            val.fsr = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "system_profile.fsr is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "system_profile.twdm_channel_count");
        if (cli_parm != NULL)
        {
            val.twdm_channel_count = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "system_profile.twdm_channel_count is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, channel, system_profile, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_system_profile val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_CHANNEL, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_CHANNEL_CFG_ID_SYSTEM_PROFILE, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, channel, system_profile, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "channel_profile.");
    if (cli_parm != NULL)
    {
        bcmolt_arr_channel_profile_8 val = { };
        cli_parm = bcmcli_find_parm_by_prefix(session, "channel_profile.arr.");
        if (cli_parm != NULL)
        {
            int32_t i0;
            if (cli_parm->array_size != 8)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "array channel_profile.arr must have 8 elements\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "channel_profile.arr.version");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 8)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "channel_profile.arr.version is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 8; i0++)
                {
                    val.arr[i0].version = cli_parm->values[i0].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "channel_profile.arr.channel_index");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 8)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "channel_profile.arr.channel_index is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 8; i0++)
                {
                    val.arr[i0].channel_index = cli_parm->values[i0].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "channel_profile.arr.ds_frequency_offset.sign");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 8)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "channel_profile.arr.ds_frequency_offset.sign is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 8; i0++)
                {
                    val.arr[i0].ds_frequency_offset.sign = (bcmolt_sign) cli_parm->values[i0].enum_val;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "channel_profile.arr.ds_frequency_offset.value");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 8)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "channel_profile.arr.ds_frequency_offset.value is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 8; i0++)
                {
                    val.arr[i0].ds_frequency_offset.value = cli_parm->values[i0].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "channel_profile.arr.channel_partition");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 8)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "channel_profile.arr.channel_partition is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 8; i0++)
                {
                    val.arr[i0].channel_partition = cli_parm->values[i0].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "channel_profile.arr.uwlch_id");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 8)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "channel_profile.arr.uwlch_id is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 8; i0++)
                {
                    val.arr[i0].uwlch_id = cli_parm->values[i0].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "channel_profile.arr.us_frequency");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 8)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "channel_profile.arr.us_frequency is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 8; i0++)
                {
                    val.arr[i0].us_frequency = cli_parm->values[i0].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "channel_profile.arr.us_rate");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 8)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "channel_profile.arr.us_rate is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 8; i0++)
                {
                    val.arr[i0].us_rate = (bcmolt_upstream_line_rate_capabilities) cli_parm->values[i0].enum_val;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "channel_profile.arr.default_onu_attenuation");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 8)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "channel_profile.arr.default_onu_attenuation is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 8; i0++)
                {
                    val.arr[i0].default_onu_attenuation = cli_parm->values[i0].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "channel_profile.arr.response_threshold");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 8)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "channel_profile.arr.response_threshold is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 8; i0++)
                {
                    val.arr[i0].response_threshold = cli_parm->values[i0].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "channel_profile.arr.us_link_type");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 8)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "channel_profile.arr.us_link_type is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 8; i0++)
                {
                    val.arr[i0].us_link_type = (bcmolt_link_type) cli_parm->values[i0].enum_val;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "channel_profile.arr.is_valid");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 8)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "channel_profile.arr.is_valid is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 8; i0++)
                {
                    val.arr[i0].is_valid = cli_parm->values[i0].number;
                }
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "channel_profile.arr is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, channel, channel_profile, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_arr_channel_profile_8 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_CHANNEL, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_CHANNEL_CFG_ID_CHANNEL_PROFILE, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, channel, channel_profile, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_cfg_set(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_set(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_channel_cfg_clear(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_channel_cfg cfg;         /**< declare main API struct */
    bcmolt_channel_key key = { };   /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_channel_cfg cfg;\n");
    bcmcli_log("bcmolt_channel_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_clear");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_pon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_CHANNEL, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_CHANNEL_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, channel, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, channel, key);\n");

    /* call API */
    err = bcmolt_cfg_clear(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_clear(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_channel_cfg_get_multi(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_channel_cfg cfg;         /**< declare main API struct */
    bcmolt_channel_key key = { };   /**< declare key */
    bcmolt_msg_set *msg_set = NULL; /**< declare message set */
    uint32_t max_msgs;              /**< declare max number of msgs to get */
    bcmos_bool invert_filter;       /**< declare filter invert flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_channel_cfg cfg;\n");
    bcmcli_log("bcmolt_channel_key key = {  };\n");
    bcmcli_log("bcmolt_msg_set* msg_set = NULL;\n");
    bcmcli_log("uint32_t max_msgs;\n");
    bcmcli_log("bcmos_bool invert_filter;\n");
    apicli_print_start(session, "bcmolt_cfg_get_multi");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_pon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_CHANNEL, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_CHANNEL_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* set max number of msgs from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "max_msgs");
    if (cli_parm != NULL)
    {
        max_msgs = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "max_msgs is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("max_msgs = %d;\n", max_msgs);

    /* set filter invert flag from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "filter_invert");
    if (cli_parm != NULL)
    {
        invert_filter = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "filter_invert is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("invert_filter = %s;\n", (invert_filter) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* allocate message set */
    err = apicli_msg_set_alloc(byte_pool, BCMOLT_OBJ_ID_CHANNEL, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);
    if (err != BCM_ERR_OK)
    {
        return err;
    }

    bcmcli_log("bcmolt_msg_set_alloc(BCMOLT_OBJ_ID_CHANNEL, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, channel, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, channel, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.operation_control.");
    if (cli_parm != NULL)
    {
        bcmolt_operation_control val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.operation_control.re");
        if (cli_parm != NULL)
        {
            val.re = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.operation_control.re is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.operation_control.odn_class");
        if (cli_parm != NULL)
        {
            val.odn_class = (bcmolt_odn_class) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.operation_control.odn_class is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.operation_control.ds_fec_mode");
        if (cli_parm != NULL)
        {
            val.ds_fec_mode = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.operation_control.ds_fec_mode is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.operation_control.protocol");
        if (cli_parm != NULL)
        {
            val.protocol = (bcmolt_tc_protocol) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.operation_control.protocol is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.operation_control.ds_link_type");
        if (cli_parm != NULL)
        {
            val.ds_link_type = (bcmolt_link_type) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.operation_control.ds_link_type is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "filter.operation_control.pon_id.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "filter.operation_control.pon_id.administrative_label");
            if (cli_parm != NULL)
            {
                val.pon_id.administrative_label = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.operation_control.pon_id.administrative_label is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.operation_control.pon_id.dwlch_id");
            if (cli_parm != NULL)
            {
                val.pon_id.dwlch_id = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.operation_control.pon_id.dwlch_id is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.operation_control.pon_id is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.operation_control.c");
        if (cli_parm != NULL)
        {
            val.c = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.operation_control.c is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, channel, operation_control, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_operation_control val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_CHANNEL, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_CHANNEL_CFG_ID_OPERATION_CONTROL, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, channel, operation_control, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "operation_control");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, channel, operation_control);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, channel, operation_control);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.tol");
    if (cli_parm != NULL)
    {
        uint16_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, channel, tol, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, channel, tol, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_CHANNEL, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_CHANNEL_CFG_ID_TOL, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "tol");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, channel, tol);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, channel, tol);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.system_profile.");
    if (cli_parm != NULL)
    {
        bcmolt_system_profile val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.system_profile.ng_2_sys_id");
        if (cli_parm != NULL)
        {
            val.ng_2_sys_id = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.system_profile.ng_2_sys_id is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.system_profile.version");
        if (cli_parm != NULL)
        {
            val.version = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.system_profile.version is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.system_profile.channel_spacing");
        if (cli_parm != NULL)
        {
            val.channel_spacing = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.system_profile.channel_spacing is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.system_profile.us_operating_wavelength_bands");
        if (cli_parm != NULL)
        {
            val.us_operating_wavelength_bands = (bcmolt_us_operating_wavelength_bands) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.system_profile.us_operating_wavelength_bands is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.system_profile.us_mse");
        if (cli_parm != NULL)
        {
            val.us_mse = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.system_profile.us_mse is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.system_profile.loose_calibration_bound");
        if (cli_parm != NULL)
        {
            val.loose_calibration_bound = (bcmolt_calibration_record) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.system_profile.loose_calibration_bound is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.system_profile.fsr");
        if (cli_parm != NULL)
        {
            val.fsr = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.system_profile.fsr is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.system_profile.twdm_channel_count");
        if (cli_parm != NULL)
        {
            val.twdm_channel_count = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.system_profile.twdm_channel_count is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, channel, system_profile, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_system_profile val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_CHANNEL, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_CHANNEL_CFG_ID_SYSTEM_PROFILE, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, channel, system_profile, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "system_profile");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, channel, system_profile);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, channel, system_profile);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.channel_profile.");
    if (cli_parm != NULL)
    {
        bcmolt_arr_channel_profile_8 val = { };
        cli_parm = bcmcli_find_parm_by_prefix(session, "filter.channel_profile.arr.");
        if (cli_parm != NULL)
        {
            int32_t i0;
            if (cli_parm->array_size != 8)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "array filter.channel_profile.arr must have 8 elements\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.channel_profile.arr.version");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 8)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.channel_profile.arr.version is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 8; i0++)
                {
                    val.arr[i0].version = cli_parm->values[i0].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.channel_profile.arr.channel_index");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 8)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.channel_profile.arr.channel_index is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 8; i0++)
                {
                    val.arr[i0].channel_index = cli_parm->values[i0].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.channel_profile.arr.ds_frequency_offset.sign");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 8)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.channel_profile.arr.ds_frequency_offset.sign is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 8; i0++)
                {
                    val.arr[i0].ds_frequency_offset.sign = (bcmolt_sign) cli_parm->values[i0].enum_val;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.channel_profile.arr.ds_frequency_offset.value");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 8)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.channel_profile.arr.ds_frequency_offset.value is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 8; i0++)
                {
                    val.arr[i0].ds_frequency_offset.value = cli_parm->values[i0].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.channel_profile.arr.channel_partition");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 8)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.channel_profile.arr.channel_partition is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 8; i0++)
                {
                    val.arr[i0].channel_partition = cli_parm->values[i0].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.channel_profile.arr.uwlch_id");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 8)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.channel_profile.arr.uwlch_id is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 8; i0++)
                {
                    val.arr[i0].uwlch_id = cli_parm->values[i0].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.channel_profile.arr.us_frequency");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 8)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.channel_profile.arr.us_frequency is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 8; i0++)
                {
                    val.arr[i0].us_frequency = cli_parm->values[i0].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.channel_profile.arr.us_rate");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 8)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.channel_profile.arr.us_rate is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 8; i0++)
                {
                    val.arr[i0].us_rate = (bcmolt_upstream_line_rate_capabilities) cli_parm->values[i0].enum_val;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.channel_profile.arr.default_onu_attenuation");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 8)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.channel_profile.arr.default_onu_attenuation is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 8; i0++)
                {
                    val.arr[i0].default_onu_attenuation = cli_parm->values[i0].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.channel_profile.arr.response_threshold");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 8)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.channel_profile.arr.response_threshold is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 8; i0++)
                {
                    val.arr[i0].response_threshold = cli_parm->values[i0].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.channel_profile.arr.us_link_type");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 8)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.channel_profile.arr.us_link_type is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 8; i0++)
                {
                    val.arr[i0].us_link_type = (bcmolt_link_type) cli_parm->values[i0].enum_val;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.channel_profile.arr.is_valid");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 8)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.channel_profile.arr.is_valid is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 8; i0++)
                {
                    val.arr[i0].is_valid = cli_parm->values[i0].number;
                }
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.channel_profile.arr is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, channel, channel_profile, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_arr_channel_profile_8 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_CHANNEL, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_CHANNEL_CFG_ID_CHANNEL_PROFILE, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, channel, channel_profile, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "channel_profile");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, channel, channel_profile);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, channel, channel_profile);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, channel, operation_control) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, channel, tol) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, channel, system_profile) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, channel, channel_profile))
    {
        BCMOLT_MSGSET_CFG_PROP_GET(msg_set, channel, all_properties);
        bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, channel, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);
    bcmcli_log("bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_debug_oper_cli_input_submit(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_debug_cli_input oper;    /**< declare main API struct */
    bcmolt_debug_key key = { };     /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_debug_cli_input oper;\n");
    bcmcli_log("bcmolt_debug_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, debug, cli_input, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, debug, cli_input, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "data");
    if (cli_parm != NULL)
    {
        bcmolt_u8_list_u32 val = { };
        val.len = bcmolt_buf_get_used(&cli_parm->value.buffer);
        val.val = apicli_byte_pool_calloc(byte_pool, val.len);
        if (val.val == NULL)
        {
            apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
            return BCM_ERR_NOMEM;
        }

        bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
        bcmolt_buf_read(&cli_parm->value.buffer, val.val, val.len);
        BCMOLT_OPER_PROP_SET(&oper, debug, cli_input, data, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_u8_list_u32 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEBUG, BCMOLT_MGT_GROUP_OPER, BCMOLT_DEBUG_OPER_ID_CLI_INPUT, BCMOLT_DEBUG_CLI_INPUT_ID_DATA, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, debug, cli_input, data, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_debug_cfg_get(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_debug_cfg cfg;       /**< declare main API struct */
    bcmolt_debug_key key = { }; /**< declare key */
    uint8_t *list_mem;          /**< declare memory buffer for variable-sized lists */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_debug_cfg cfg;\n");
    bcmcli_log("bcmolt_debug_key key = {  };\n");
    bcmcli_log("uint8_t* list_mem;\n");
    apicli_print_start(session, "bcmolt_cfg_get");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, debug, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, debug, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "console_redirection");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, debug, console_redirection);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, debug, console_redirection);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "indications_dropped");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, debug, indications_dropped);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, debug, indications_dropped);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "file_used_percent");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, debug, file_used_percent);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, debug, file_used_percent);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "api_capture_cfg");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, debug, api_capture_cfg);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, debug, api_capture_cfg);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "api_capture_stats");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, debug, api_capture_stats);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, debug, api_capture_stats);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "api_capture_buffer_read");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, debug, api_capture_buffer_read);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, debug, api_capture_buffer_read);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "api_capture_buffer");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, debug, api_capture_buffer);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, debug, api_capture_buffer);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_CFG_PROP_IS_SET(&cfg, debug, console_redirection) && !BCMOLT_CFG_PROP_IS_SET(&cfg, debug, indications_dropped) && !BCMOLT_CFG_PROP_IS_SET(&cfg, debug, file_used_percent) && !BCMOLT_CFG_PROP_IS_SET(&cfg, debug, api_capture_cfg) && !BCMOLT_CFG_PROP_IS_SET(&cfg, debug, api_capture_stats) && !BCMOLT_CFG_PROP_IS_SET(&cfg, debug, api_capture_buffer_read) && !BCMOLT_CFG_PROP_IS_SET(&cfg, debug, api_capture_buffer))
    {
        BCMOLT_CFG_PROP_GET(&cfg, debug, all_properties);
        bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, debug, all_properties);\n");
    }

    /* set memory to use for variable-sized lists */
    list_mem = apicli_byte_pool_calloc(byte_pool, APICLI_DYNAMIC_LIST_BUFFER_SIZE);
    if (list_mem == NULL)
    {
        apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
        return BCM_ERR_NOMEM;
    }

    bcmcli_log("list_mem = bcmos_calloc(APICLI_DYNAMIC_LIST_BUFFER_SIZE);\n");
    BCMOLT_CFG_LIST_BUF_SET(&cfg, debug, list_mem, APICLI_DYNAMIC_LIST_BUFFER_SIZE);
    bcmcli_log("BCMOLT_CFG_LIST_BUF_SET(&cfg, debug, list_mem, APICLI_DYNAMIC_LIST_BUFFER_SIZE);\n");

    /* call API */
    err = bcmolt_cfg_get(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_get(device_id, &cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_debug_cfg_set(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_debug_cfg cfg;       /**< declare main API struct */
    bcmolt_debug_key key = { }; /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_debug_cfg cfg;\n");
    bcmcli_log("bcmolt_debug_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_set");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, debug, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, debug, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "console_redirection");
    if (cli_parm != NULL)
    {
        bcmolt_console_redirection val;
        val = (bcmolt_console_redirection) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, debug, console_redirection, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, debug, console_redirection, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEBUG, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEBUG_CFG_ID_CONSOLE_REDIRECTION, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "api_capture_cfg.");
    if (cli_parm != NULL)
    {
        bcmolt_api_capture_config val = { };
        cli_parm = bcmcli_find_named_parm(session, "api_capture_cfg.location");
        if (cli_parm != NULL)
        {
            val.location = (bcmolt_api_capture_location) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "api_capture_cfg.location is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "api_capture_cfg.buffer_size_bytes");
        if (cli_parm != NULL)
        {
            val.buffer_size_bytes = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "api_capture_cfg.buffer_size_bytes is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "api_capture_cfg.buffer_mode");
        if (cli_parm != NULL)
        {
            val.buffer_mode = (bcmolt_api_capture_buffer_mode) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "api_capture_cfg.buffer_mode is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, debug, api_capture_cfg, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_api_capture_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEBUG, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEBUG_CFG_ID_API_CAPTURE_CFG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, debug, api_capture_cfg, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "api_capture_buffer_read.");
    if (cli_parm != NULL)
    {
        bcmolt_api_capture_buffer_reader val = { };
        cli_parm = bcmcli_find_named_parm(session, "api_capture_buffer_read.offset");
        if (cli_parm != NULL)
        {
            val.offset = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "api_capture_buffer_read.offset is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "api_capture_buffer_read.size");
        if (cli_parm != NULL)
        {
            val.size = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "api_capture_buffer_read.size is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, debug, api_capture_buffer_read, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_api_capture_buffer_reader val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEBUG, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEBUG_CFG_ID_API_CAPTURE_BUFFER_READ, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, debug, api_capture_buffer_read, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_cfg_set(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_set(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_debug_cfg_clear(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmos_errno err;
    bcmolt_debug_cfg cfg;       /**< declare main API struct */
    bcmolt_debug_key key = { }; /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_debug_cfg cfg;\n");
    bcmcli_log("bcmolt_debug_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_clear");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, debug, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, debug, key);\n");

    /* call API */
    err = bcmolt_cfg_clear(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_clear(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_debug_cfg_get_multi(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_debug_cfg cfg;           /**< declare main API struct */
    bcmolt_debug_key key = { };     /**< declare key */
    bcmolt_msg_set *msg_set = NULL; /**< declare message set */
    uint32_t max_msgs;              /**< declare max number of msgs to get */
    bcmos_bool invert_filter;       /**< declare filter invert flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_debug_cfg cfg;\n");
    bcmcli_log("bcmolt_debug_key key = {  };\n");
    bcmcli_log("bcmolt_msg_set* msg_set = NULL;\n");
    bcmcli_log("uint32_t max_msgs;\n");
    bcmcli_log("bcmos_bool invert_filter;\n");
    apicli_print_start(session, "bcmolt_cfg_get_multi");

    /* set max number of msgs from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "max_msgs");
    if (cli_parm != NULL)
    {
        max_msgs = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "max_msgs is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("max_msgs = %d;\n", max_msgs);

    /* set filter invert flag from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "filter_invert");
    if (cli_parm != NULL)
    {
        invert_filter = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "filter_invert is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("invert_filter = %s;\n", (invert_filter) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* allocate message set */
    err = apicli_msg_set_alloc(byte_pool, BCMOLT_OBJ_ID_DEBUG, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);
    if (err != BCM_ERR_OK)
    {
        return err;
    }

    bcmcli_log("bcmolt_msg_set_alloc(BCMOLT_OBJ_ID_DEBUG, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, debug, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, debug, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "filter.console_redirection");
    if (cli_parm != NULL)
    {
        bcmolt_console_redirection val;
        val = (bcmolt_console_redirection) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, debug, console_redirection, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, debug, console_redirection, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEBUG, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEBUG_CFG_ID_CONSOLE_REDIRECTION, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "console_redirection");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, debug, console_redirection);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, debug, console_redirection);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.indications_dropped");
    if (cli_parm != NULL)
    {
        uint32_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, debug, indications_dropped, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, debug, indications_dropped, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEBUG, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEBUG_CFG_ID_INDICATIONS_DROPPED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "indications_dropped");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, debug, indications_dropped);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, debug, indications_dropped);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.file_used_percent");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, debug, file_used_percent, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, debug, file_used_percent, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEBUG, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEBUG_CFG_ID_FILE_USED_PERCENT, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "file_used_percent");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, debug, file_used_percent);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, debug, file_used_percent);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.api_capture_cfg.");
    if (cli_parm != NULL)
    {
        bcmolt_api_capture_config val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.api_capture_cfg.location");
        if (cli_parm != NULL)
        {
            val.location = (bcmolt_api_capture_location) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.api_capture_cfg.location is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.api_capture_cfg.buffer_size_bytes");
        if (cli_parm != NULL)
        {
            val.buffer_size_bytes = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.api_capture_cfg.buffer_size_bytes is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.api_capture_cfg.buffer_mode");
        if (cli_parm != NULL)
        {
            val.buffer_mode = (bcmolt_api_capture_buffer_mode) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.api_capture_cfg.buffer_mode is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, debug, api_capture_cfg, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_api_capture_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEBUG, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEBUG_CFG_ID_API_CAPTURE_CFG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, debug, api_capture_cfg, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "api_capture_cfg");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, debug, api_capture_cfg);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, debug, api_capture_cfg);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.api_capture_stats.");
    if (cli_parm != NULL)
    {
        bcmolt_api_capture_stats val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.api_capture_stats.buffer_used_bytes");
        if (cli_parm != NULL)
        {
            val.buffer_used_bytes = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.api_capture_stats.buffer_used_bytes is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.api_capture_stats.buffer_wrap_count");
        if (cli_parm != NULL)
        {
            val.buffer_wrap_count = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.api_capture_stats.buffer_wrap_count is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.api_capture_stats.events_recorded");
        if (cli_parm != NULL)
        {
            val.events_recorded = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.api_capture_stats.events_recorded is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.api_capture_stats.events_dropped");
        if (cli_parm != NULL)
        {
            val.events_dropped = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.api_capture_stats.events_dropped is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.api_capture_stats.readable_bytes");
        if (cli_parm != NULL)
        {
            val.readable_bytes = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.api_capture_stats.readable_bytes is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, debug, api_capture_stats, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_api_capture_stats val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEBUG, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEBUG_CFG_ID_API_CAPTURE_STATS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, debug, api_capture_stats, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "api_capture_stats");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, debug, api_capture_stats);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, debug, api_capture_stats);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.api_capture_buffer_read.");
    if (cli_parm != NULL)
    {
        bcmolt_api_capture_buffer_reader val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.api_capture_buffer_read.offset");
        if (cli_parm != NULL)
        {
            val.offset = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.api_capture_buffer_read.offset is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.api_capture_buffer_read.size");
        if (cli_parm != NULL)
        {
            val.size = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.api_capture_buffer_read.size is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, debug, api_capture_buffer_read, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_api_capture_buffer_reader val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEBUG, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEBUG_CFG_ID_API_CAPTURE_BUFFER_READ, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, debug, api_capture_buffer_read, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "api_capture_buffer_read");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, debug, api_capture_buffer_read);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, debug, api_capture_buffer_read);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.api_capture_buffer");
    if (cli_parm != NULL)
    {
        bcmolt_u8_list_u32 val = { };
        val.len = bcmolt_buf_get_used(&cli_parm->value.buffer);
        val.val = apicli_byte_pool_calloc(byte_pool, val.len);
        if (val.val == NULL)
        {
            apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
            return BCM_ERR_NOMEM;
        }

        bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
        bcmolt_buf_read(&cli_parm->value.buffer, val.val, val.len);
        BCMOLT_CFG_PROP_SET(&cfg, debug, api_capture_buffer, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_u8_list_u32 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEBUG, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEBUG_CFG_ID_API_CAPTURE_BUFFER, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, debug, api_capture_buffer, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "api_capture_buffer");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, debug, api_capture_buffer);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, debug, api_capture_buffer);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, debug, console_redirection) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, debug, indications_dropped) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, debug, file_used_percent) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, debug, api_capture_cfg) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, debug, api_capture_stats) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, debug, api_capture_buffer_read) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, debug, api_capture_buffer))
    {
        BCMOLT_MSGSET_CFG_PROP_GET(msg_set, debug, all_properties);
        bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, debug, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);
    bcmcli_log("bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_debug_oper_start_api_capture_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmos_errno err;
    bcmolt_debug_start_api_capture oper;    /**< declare main API struct */
    bcmolt_debug_key key = { };             /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_debug_start_api_capture oper;\n");
    bcmcli_log("bcmolt_debug_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, debug, start_api_capture, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, debug, start_api_capture, key);\n");

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_debug_oper_stop_api_capture_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmos_errno err;
    bcmolt_debug_stop_api_capture oper; /**< declare main API struct */
    bcmolt_debug_key key = { };         /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_debug_stop_api_capture oper;\n");
    bcmcli_log("bcmolt_debug_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, debug, stop_api_capture, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, debug, stop_api_capture, key);\n");

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_debug_oper_reset_api_capture_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmos_errno err;
    bcmolt_debug_reset_api_capture oper;    /**< declare main API struct */
    bcmolt_debug_key key = { };             /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_debug_reset_api_capture oper;\n");
    bcmcli_log("bcmolt_debug_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, debug, reset_api_capture, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, debug, reset_api_capture, key);\n");

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_debug_auto_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_debug_auto_cfg auto_cfg; /**< declare main API struct */
    bcmolt_debug_key key = { };     /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_debug_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_debug_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_get");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, debug, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, debug, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "cli_output");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, debug, cli_output);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, debug, cli_output);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "file_almost_full");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, debug, file_almost_full);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, debug, file_almost_full);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, debug, cli_output) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, debug, file_almost_full))
    {
        BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, debug, all_properties);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, debug, all_properties);\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &auto_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_debug_auto_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_debug_auto_cfg auto_cfg; /**< declare main API struct */
    bcmolt_debug_key key = { };     /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_debug_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_debug_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_set");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, debug, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, debug, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "cli_output");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, debug, cli_output, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, debug, cli_output, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEBUG, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_DEBUG_AUTO_CFG_ID_CLI_OUTPUT, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "file_almost_full");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, debug, file_almost_full, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, debug, file_almost_full, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEBUG, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_DEBUG_AUTO_CFG_ID_FILE_ALMOST_FULL, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);\n");
    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_device_cfg_get(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_device_cfg cfg;          /**< declare main API struct */
    bcmolt_device_key key = { };    /**< declare key */
    uint8_t *list_mem;              /**< declare memory buffer for variable-sized lists */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_device_cfg cfg;\n");
    bcmcli_log("bcmolt_device_key key = {  };\n");
    bcmcli_log("uint8_t* list_mem;\n");
    apicli_print_start(session, "bcmolt_cfg_get");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, device, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, device, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "system_mode");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, device, system_mode);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, device, system_mode);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "keepalive_interval");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, device, keepalive_interval);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, device, keepalive_interval);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "keepalive_tolerance");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, device, keepalive_tolerance);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, device, keepalive_tolerance);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "firmware_sw_version");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, device, firmware_sw_version);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, device, firmware_sw_version);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "host_sw_version");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, device, host_sw_version);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, device, host_sw_version);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "chip_revision");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, device, chip_revision);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, device, chip_revision);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "state");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, device, state);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, device, state);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "debug");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, device, debug);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, device, debug);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "nni_speed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, device, nni_speed);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, device, nni_speed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "protection_switching_ext_irq");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, device, protection_switching_ext_irq);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, device, protection_switching_ext_irq);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "epon_clock_transport_sample_delay");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, device, epon_clock_transport_sample_delay);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, device, epon_clock_transport_sample_delay);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "indication_shaping");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, device, indication_shaping);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, device, indication_shaping);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "chip_temperature");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, device, chip_temperature);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, device, chip_temperature);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "gpon_xgpon_tod_enable");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, device, gpon_xgpon_tod_enable);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, device, gpon_xgpon_tod_enable);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "gpon_xgpon_tod_gpio_pin");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, device, gpon_xgpon_tod_gpio_pin);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, device, gpon_xgpon_tod_gpio_pin);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "gpon_xgpon_tod_connected_internally");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, device, gpon_xgpon_tod_connected_internally);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, device, gpon_xgpon_tod_connected_internally);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "epon_8021_as_tod_format");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, device, epon_8021_as_tod_format);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, device, epon_8021_as_tod_format);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "epon_shaper_mode");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, device, epon_shaper_mode);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, device, epon_shaper_mode);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "embedded_image_list");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, device, embedded_image_list);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, device, embedded_image_list);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "chip_voltage");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, device, chip_voltage);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, device, chip_voltage);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "epon_tod_string");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, device, epon_tod_string);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, device, epon_tod_string);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "xgpon_num_of_onus");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, device, xgpon_num_of_onus);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, device, xgpon_num_of_onus);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "device_ip_address");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, device, device_ip_address);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, device, device_ip_address);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "device_udp_port");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, device, device_udp_port);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, device, device_udp_port);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tod_uart_baudrate");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, device, tod_uart_baudrate);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, device, tod_uart_baudrate);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "gpon_xgpon_tod_string_length");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, device, gpon_xgpon_tod_string_length);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, device, gpon_xgpon_tod_string_length);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_CFG_PROP_IS_SET(&cfg, device, system_mode) && !BCMOLT_CFG_PROP_IS_SET(&cfg, device, keepalive_interval) && !BCMOLT_CFG_PROP_IS_SET(&cfg, device, keepalive_tolerance) && !BCMOLT_CFG_PROP_IS_SET(&cfg, device, firmware_sw_version) && !BCMOLT_CFG_PROP_IS_SET(&cfg, device, host_sw_version) && !BCMOLT_CFG_PROP_IS_SET(&cfg, device, chip_revision) && !BCMOLT_CFG_PROP_IS_SET(&cfg, device, state) && !BCMOLT_CFG_PROP_IS_SET(&cfg, device, debug) && !BCMOLT_CFG_PROP_IS_SET(&cfg, device, nni_speed) && !BCMOLT_CFG_PROP_IS_SET(&cfg, device, protection_switching_ext_irq) && !BCMOLT_CFG_PROP_IS_SET(&cfg, device, epon_clock_transport_sample_delay) && !BCMOLT_CFG_PROP_IS_SET(&cfg, device, indication_shaping) && !BCMOLT_CFG_PROP_IS_SET(&cfg, device, chip_temperature) && !BCMOLT_CFG_PROP_IS_SET(&cfg, device, gpon_xgpon_tod_enable) && !BCMOLT_CFG_PROP_IS_SET(&cfg, device, gpon_xgpon_tod_gpio_pin) && !BCMOLT_CFG_PROP_IS_SET(&cfg, device, gpon_xgpon_tod_connected_internally) && !BCMOLT_CFG_PROP_IS_SET(&cfg, device, epon_8021_as_tod_format) && !BCMOLT_CFG_PROP_IS_SET(&cfg, device, epon_shaper_mode) && !BCMOLT_CFG_PROP_IS_SET(&cfg, device, embedded_image_list) && !BCMOLT_CFG_PROP_IS_SET(&cfg, device, chip_voltage) && !BCMOLT_CFG_PROP_IS_SET(&cfg, device, epon_tod_string) && !BCMOLT_CFG_PROP_IS_SET(&cfg, device, xgpon_num_of_onus) && !BCMOLT_CFG_PROP_IS_SET(&cfg, device, device_ip_address) && !BCMOLT_CFG_PROP_IS_SET(&cfg, device, device_udp_port) && !BCMOLT_CFG_PROP_IS_SET(&cfg, device, tod_uart_baudrate) && !BCMOLT_CFG_PROP_IS_SET(&cfg, device, gpon_xgpon_tod_string_length))
    {
        BCMOLT_CFG_PROP_GET(&cfg, device, all_properties);
        bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, device, all_properties);\n");
    }

    /* set memory to use for variable-sized lists */
    list_mem = apicli_byte_pool_calloc(byte_pool, APICLI_DYNAMIC_LIST_BUFFER_SIZE);
    if (list_mem == NULL)
    {
        apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
        return BCM_ERR_NOMEM;
    }

    bcmcli_log("list_mem = bcmos_calloc(APICLI_DYNAMIC_LIST_BUFFER_SIZE);\n");
    BCMOLT_CFG_LIST_BUF_SET(&cfg, device, list_mem, APICLI_DYNAMIC_LIST_BUFFER_SIZE);
    bcmcli_log("BCMOLT_CFG_LIST_BUF_SET(&cfg, device, list_mem, APICLI_DYNAMIC_LIST_BUFFER_SIZE);\n");

    /* call API */
    err = bcmolt_cfg_get(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_get(device_id, &cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_device_cfg_set(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_device_cfg cfg;          /**< declare main API struct */
    bcmolt_device_key key = { };    /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_device_cfg cfg;\n");
    bcmcli_log("bcmolt_device_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_set");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, device, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, device, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "system_mode");
    if (cli_parm != NULL)
    {
        bcmolt_system_mode val;
        val = (bcmolt_system_mode) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, device, system_mode, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, device, system_mode, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEVICE_CFG_ID_SYSTEM_MODE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "keepalive_interval");
    if (cli_parm != NULL)
    {
        uint32_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, device, keepalive_interval, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, device, keepalive_interval, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEVICE_CFG_ID_KEEPALIVE_INTERVAL, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "keepalive_tolerance");
    if (cli_parm != NULL)
    {
        uint32_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, device, keepalive_tolerance, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, device, keepalive_tolerance, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEVICE_CFG_ID_KEEPALIVE_TOLERANCE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "debug.");
    if (cli_parm != NULL)
    {
        bcmolt_debug_device_cfg val = { };
        cli_parm = bcmcli_find_named_parm(session, "debug.host_dma_rx_queue_size");
        if (cli_parm != NULL)
        {
            val.host_dma_rx_queue_size = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "debug.host_dma_rx_queue_size is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "debug.host_dma_tx_queue_size");
        if (cli_parm != NULL)
        {
            val.host_dma_tx_queue_size = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "debug.host_dma_tx_queue_size is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "debug.avs_control");
        if (cli_parm != NULL)
        {
            val.avs_control = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "debug.avs_control is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "debug.use_prev_pon_serdes_firmware");
        if (cli_parm != NULL)
        {
            val.use_prev_pon_serdes_firmware = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "debug.use_prev_pon_serdes_firmware is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "debug.use_prev_nni_serdes_firmware");
        if (cli_parm != NULL)
        {
            val.use_prev_nni_serdes_firmware = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "debug.use_prev_nni_serdes_firmware is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, device, debug, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_debug_device_cfg val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEVICE_CFG_ID_DEBUG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, device, debug, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "nni_speed.");
    if (cli_parm != NULL)
    {
        bcmolt_device_nni_speed val = { };
        cli_parm = bcmcli_find_named_parm(session, "nni_speed.first_half");
        if (cli_parm != NULL)
        {
            val.first_half = (bcmolt_nni_speed) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "nni_speed.first_half is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "nni_speed.second_half");
        if (cli_parm != NULL)
        {
            val.second_half = (bcmolt_nni_speed) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "nni_speed.second_half is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, device, nni_speed, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_device_nni_speed val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEVICE_CFG_ID_NNI_SPEED, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, device, nni_speed, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "protection_switching_ext_irq");
    if (cli_parm != NULL)
    {
        bcmolt_ext_irq val;
        val = (bcmolt_ext_irq) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, device, protection_switching_ext_irq, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, device, protection_switching_ext_irq, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEVICE_CFG_ID_PROTECTION_SWITCHING_EXT_IRQ, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "epon_clock_transport_sample_delay");
    if (cli_parm != NULL)
    {
        uint32_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, device, epon_clock_transport_sample_delay, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, device, epon_clock_transport_sample_delay, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEVICE_CFG_ID_EPON_CLOCK_TRANSPORT_SAMPLE_DELAY, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "indication_shaping.");
    if (cli_parm != NULL)
    {
        bcmolt_indication_shaping val = { };
        cli_parm = bcmcli_find_named_parm(session, "indication_shaping.enabled");
        if (cli_parm != NULL)
        {
            val.enabled = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "indication_shaping.enabled is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "indication_shaping.max_rate");
        if (cli_parm != NULL)
        {
            val.max_rate = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "indication_shaping.max_rate is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "indication_shaping.max_burst");
        if (cli_parm != NULL)
        {
            val.max_burst = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "indication_shaping.max_burst is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, device, indication_shaping, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_indication_shaping val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEVICE_CFG_ID_INDICATION_SHAPING, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, device, indication_shaping, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "gpon_xgpon_tod_enable");
    if (cli_parm != NULL)
    {
        bcmolt_control_state val;
        val = (bcmolt_control_state) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, device, gpon_xgpon_tod_enable, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, device, gpon_xgpon_tod_enable, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEVICE_CFG_ID_GPON_XGPON_TOD_ENABLE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "gpon_xgpon_tod_gpio_pin");
    if (cli_parm != NULL)
    {
        bcmolt_gpio_pin val;
        val = (bcmolt_gpio_pin) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, device, gpon_xgpon_tod_gpio_pin, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, device, gpon_xgpon_tod_gpio_pin, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEVICE_CFG_ID_GPON_XGPON_TOD_GPIO_PIN, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "gpon_xgpon_tod_connected_internally");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, device, gpon_xgpon_tod_connected_internally, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, device, gpon_xgpon_tod_connected_internally, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEVICE_CFG_ID_GPON_XGPON_TOD_CONNECTED_INTERNALLY, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "epon_8021_as_tod_format.");
    if (cli_parm != NULL)
    {
        bcmolt_str_256 val = { };
        cli_parm = bcmcli_find_named_parm(session, "epon_8021_as_tod_format.str");
        if (cli_parm != NULL)
        {
            snprintf(val.str, 256, "%s", cli_parm->value.string);
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "epon_8021_as_tod_format.str is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, device, epon_8021_as_tod_format, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_str_256 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEVICE_CFG_ID_EPON_8021_AS_TOD_FORMAT, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, device, epon_8021_as_tod_format, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "epon_shaper_mode");
    if (cli_parm != NULL)
    {
        bcmolt_shaper_mode val;
        val = (bcmolt_shaper_mode) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, device, epon_shaper_mode, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, device, epon_shaper_mode, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEVICE_CFG_ID_EPON_SHAPER_MODE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "epon_tod_string.");
    if (cli_parm != NULL)
    {
        bcmolt_str_256 val = { };
        cli_parm = bcmcli_find_named_parm(session, "epon_tod_string.str");
        if (cli_parm != NULL)
        {
            snprintf(val.str, 256, "%s", cli_parm->value.string);
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "epon_tod_string.str is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, device, epon_tod_string, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_str_256 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEVICE_CFG_ID_EPON_TOD_STRING, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, device, epon_tod_string, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "xgpon_num_of_onus");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_num_of_onus val;
        val = (bcmolt_xgpon_num_of_onus) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, device, xgpon_num_of_onus, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, device, xgpon_num_of_onus, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEVICE_CFG_ID_XGPON_NUM_OF_ONUS, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "device_ip_address");
    if (cli_parm != NULL)
    {
        bcmos_ipv4_address val;
        val = apicli_unumber_to_ipv4(cli_parm->value.unumber);
        BCMOLT_CFG_PROP_SET(&cfg, device, device_ip_address, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, device, device_ip_address, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEVICE_CFG_ID_DEVICE_IP_ADDRESS, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "device_udp_port");
    if (cli_parm != NULL)
    {
        uint16_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, device, device_udp_port, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, device, device_udp_port, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEVICE_CFG_ID_DEVICE_UDP_PORT, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "tod_uart_baudrate");
    if (cli_parm != NULL)
    {
        bcmolt_uart_baudrate val;
        val = (bcmolt_uart_baudrate) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, device, tod_uart_baudrate, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, device, tod_uart_baudrate, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEVICE_CFG_ID_TOD_UART_BAUDRATE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "gpon_xgpon_tod_string_length");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, device, gpon_xgpon_tod_string_length, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, device, gpon_xgpon_tod_string_length, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEVICE_CFG_ID_GPON_XGPON_TOD_STRING_LENGTH, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_cfg_set(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_set(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_device_cfg_clear(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmos_errno err;
    bcmolt_device_cfg cfg;          /**< declare main API struct */
    bcmolt_device_key key = { };    /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_device_cfg cfg;\n");
    bcmcli_log("bcmolt_device_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_clear");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, device, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, device, key);\n");

    /* call API */
    err = bcmolt_cfg_clear(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_clear(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_device_cfg_get_multi(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_device_cfg cfg;          /**< declare main API struct */
    bcmolt_device_key key = { };    /**< declare key */
    bcmolt_msg_set *msg_set = NULL; /**< declare message set */
    uint32_t max_msgs;              /**< declare max number of msgs to get */
    bcmos_bool invert_filter;       /**< declare filter invert flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_device_cfg cfg;\n");
    bcmcli_log("bcmolt_device_key key = {  };\n");
    bcmcli_log("bcmolt_msg_set* msg_set = NULL;\n");
    bcmcli_log("uint32_t max_msgs;\n");
    bcmcli_log("bcmos_bool invert_filter;\n");
    apicli_print_start(session, "bcmolt_cfg_get_multi");

    /* set max number of msgs from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "max_msgs");
    if (cli_parm != NULL)
    {
        max_msgs = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "max_msgs is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("max_msgs = %d;\n", max_msgs);

    /* set filter invert flag from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "filter_invert");
    if (cli_parm != NULL)
    {
        invert_filter = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "filter_invert is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("invert_filter = %s;\n", (invert_filter) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* allocate message set */
    err = apicli_msg_set_alloc(byte_pool, BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);
    if (err != BCM_ERR_OK)
    {
        return err;
    }

    bcmcli_log("bcmolt_msg_set_alloc(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, device, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, device, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "filter.system_mode");
    if (cli_parm != NULL)
    {
        bcmolt_system_mode val;
        val = (bcmolt_system_mode) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, device, system_mode, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, device, system_mode, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEVICE_CFG_ID_SYSTEM_MODE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "system_mode");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, system_mode);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, system_mode);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.keepalive_interval");
    if (cli_parm != NULL)
    {
        uint32_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, device, keepalive_interval, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, device, keepalive_interval, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEVICE_CFG_ID_KEEPALIVE_INTERVAL, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "keepalive_interval");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, keepalive_interval);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, keepalive_interval);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.keepalive_tolerance");
    if (cli_parm != NULL)
    {
        uint32_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, device, keepalive_tolerance, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, device, keepalive_tolerance, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEVICE_CFG_ID_KEEPALIVE_TOLERANCE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "keepalive_tolerance");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, keepalive_tolerance);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, keepalive_tolerance);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.firmware_sw_version.");
    if (cli_parm != NULL)
    {
        bcmolt_firmware_sw_version val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.firmware_sw_version.major");
        if (cli_parm != NULL)
        {
            val.major = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.firmware_sw_version.major is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.firmware_sw_version.minor");
        if (cli_parm != NULL)
        {
            val.minor = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.firmware_sw_version.minor is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.firmware_sw_version.revision");
        if (cli_parm != NULL)
        {
            val.revision = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.firmware_sw_version.revision is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.firmware_sw_version.model");
        if (cli_parm != NULL)
        {
            val.model = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.firmware_sw_version.model is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.firmware_sw_version.build_time");
        if (cli_parm != NULL)
        {
            snprintf(val.build_time, 32, "%s", cli_parm->value.string);
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.firmware_sw_version.build_time is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, device, firmware_sw_version, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_firmware_sw_version val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEVICE_CFG_ID_FIRMWARE_SW_VERSION, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, device, firmware_sw_version, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "firmware_sw_version");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, firmware_sw_version);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, firmware_sw_version);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.host_sw_version.");
    if (cli_parm != NULL)
    {
        bcmolt_host_sw_version val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.host_sw_version.major");
        if (cli_parm != NULL)
        {
            val.major = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.host_sw_version.major is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.host_sw_version.minor");
        if (cli_parm != NULL)
        {
            val.minor = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.host_sw_version.minor is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.host_sw_version.revision");
        if (cli_parm != NULL)
        {
            val.revision = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.host_sw_version.revision is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.host_sw_version.model");
        if (cli_parm != NULL)
        {
            val.model = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.host_sw_version.model is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.host_sw_version.build_time");
        if (cli_parm != NULL)
        {
            snprintf(val.build_time, 32, "%s", cli_parm->value.string);
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.host_sw_version.build_time is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, device, host_sw_version, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_host_sw_version val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEVICE_CFG_ID_HOST_SW_VERSION, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, device, host_sw_version, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "host_sw_version");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, host_sw_version);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, host_sw_version);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.chip_revision");
    if (cli_parm != NULL)
    {
        bcmolt_device_chip_revision val;
        val = (bcmolt_device_chip_revision) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, device, chip_revision, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, device, chip_revision, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEVICE_CFG_ID_CHIP_REVISION, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "chip_revision");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, chip_revision);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, chip_revision);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.state");
    if (cli_parm != NULL)
    {
        bcmolt_device_state val;
        val = (bcmolt_device_state) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, device, state, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, device, state, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEVICE_CFG_ID_STATE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "state");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, state);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, state);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.debug.");
    if (cli_parm != NULL)
    {
        bcmolt_debug_device_cfg val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.debug.host_dma_rx_queue_size");
        if (cli_parm != NULL)
        {
            val.host_dma_rx_queue_size = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.debug.host_dma_rx_queue_size is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.debug.host_dma_tx_queue_size");
        if (cli_parm != NULL)
        {
            val.host_dma_tx_queue_size = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.debug.host_dma_tx_queue_size is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.debug.avs_control");
        if (cli_parm != NULL)
        {
            val.avs_control = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.debug.avs_control is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.debug.use_prev_pon_serdes_firmware");
        if (cli_parm != NULL)
        {
            val.use_prev_pon_serdes_firmware = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.debug.use_prev_pon_serdes_firmware is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.debug.use_prev_nni_serdes_firmware");
        if (cli_parm != NULL)
        {
            val.use_prev_nni_serdes_firmware = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.debug.use_prev_nni_serdes_firmware is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, device, debug, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_debug_device_cfg val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEVICE_CFG_ID_DEBUG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, device, debug, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "debug");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, debug);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, debug);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.nni_speed.");
    if (cli_parm != NULL)
    {
        bcmolt_device_nni_speed val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.nni_speed.first_half");
        if (cli_parm != NULL)
        {
            val.first_half = (bcmolt_nni_speed) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.nni_speed.first_half is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.nni_speed.second_half");
        if (cli_parm != NULL)
        {
            val.second_half = (bcmolt_nni_speed) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.nni_speed.second_half is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, device, nni_speed, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_device_nni_speed val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEVICE_CFG_ID_NNI_SPEED, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, device, nni_speed, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "nni_speed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, nni_speed);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, nni_speed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.protection_switching_ext_irq");
    if (cli_parm != NULL)
    {
        bcmolt_ext_irq val;
        val = (bcmolt_ext_irq) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, device, protection_switching_ext_irq, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, device, protection_switching_ext_irq, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEVICE_CFG_ID_PROTECTION_SWITCHING_EXT_IRQ, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "protection_switching_ext_irq");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, protection_switching_ext_irq);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, protection_switching_ext_irq);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.epon_clock_transport_sample_delay");
    if (cli_parm != NULL)
    {
        uint32_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, device, epon_clock_transport_sample_delay, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, device, epon_clock_transport_sample_delay, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEVICE_CFG_ID_EPON_CLOCK_TRANSPORT_SAMPLE_DELAY, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "epon_clock_transport_sample_delay");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, epon_clock_transport_sample_delay);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, epon_clock_transport_sample_delay);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.indication_shaping.");
    if (cli_parm != NULL)
    {
        bcmolt_indication_shaping val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.indication_shaping.enabled");
        if (cli_parm != NULL)
        {
            val.enabled = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.indication_shaping.enabled is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.indication_shaping.max_rate");
        if (cli_parm != NULL)
        {
            val.max_rate = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.indication_shaping.max_rate is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.indication_shaping.max_burst");
        if (cli_parm != NULL)
        {
            val.max_burst = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.indication_shaping.max_burst is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, device, indication_shaping, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_indication_shaping val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEVICE_CFG_ID_INDICATION_SHAPING, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, device, indication_shaping, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "indication_shaping");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, indication_shaping);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, indication_shaping);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.chip_temperature");
    if (cli_parm != NULL)
    {
        uint32_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, device, chip_temperature, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, device, chip_temperature, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEVICE_CFG_ID_CHIP_TEMPERATURE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "chip_temperature");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, chip_temperature);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, chip_temperature);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.gpon_xgpon_tod_enable");
    if (cli_parm != NULL)
    {
        bcmolt_control_state val;
        val = (bcmolt_control_state) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, device, gpon_xgpon_tod_enable, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, device, gpon_xgpon_tod_enable, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEVICE_CFG_ID_GPON_XGPON_TOD_ENABLE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "gpon_xgpon_tod_enable");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, gpon_xgpon_tod_enable);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, gpon_xgpon_tod_enable);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.gpon_xgpon_tod_gpio_pin");
    if (cli_parm != NULL)
    {
        bcmolt_gpio_pin val;
        val = (bcmolt_gpio_pin) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, device, gpon_xgpon_tod_gpio_pin, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, device, gpon_xgpon_tod_gpio_pin, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEVICE_CFG_ID_GPON_XGPON_TOD_GPIO_PIN, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "gpon_xgpon_tod_gpio_pin");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, gpon_xgpon_tod_gpio_pin);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, gpon_xgpon_tod_gpio_pin);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.gpon_xgpon_tod_connected_internally");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, device, gpon_xgpon_tod_connected_internally, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, device, gpon_xgpon_tod_connected_internally, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEVICE_CFG_ID_GPON_XGPON_TOD_CONNECTED_INTERNALLY, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "gpon_xgpon_tod_connected_internally");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, gpon_xgpon_tod_connected_internally);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, gpon_xgpon_tod_connected_internally);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.epon_8021_as_tod_format.");
    if (cli_parm != NULL)
    {
        bcmolt_str_256 val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.epon_8021_as_tod_format.str");
        if (cli_parm != NULL)
        {
            snprintf(val.str, 256, "%s", cli_parm->value.string);
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.epon_8021_as_tod_format.str is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, device, epon_8021_as_tod_format, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_str_256 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEVICE_CFG_ID_EPON_8021_AS_TOD_FORMAT, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, device, epon_8021_as_tod_format, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "epon_8021_as_tod_format");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, epon_8021_as_tod_format);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, epon_8021_as_tod_format);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.epon_shaper_mode");
    if (cli_parm != NULL)
    {
        bcmolt_shaper_mode val;
        val = (bcmolt_shaper_mode) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, device, epon_shaper_mode, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, device, epon_shaper_mode, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEVICE_CFG_ID_EPON_SHAPER_MODE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "epon_shaper_mode");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, epon_shaper_mode);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, epon_shaper_mode);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.embedded_image_list.");
    if (cli_parm != NULL)
    {
        bcmolt_embedded_image_entry_list_u8 val = { };
        int32_t i0;
        val.val = apicli_byte_pool_calloc(byte_pool, cli_parm->array_size * sizeof(*val.val));
        if (val.val == NULL)
        {
            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, "filter.embedded_image_list.image_type");
        if (cli_parm != NULL)
        {
            if (cli_parm->array_size != val.len)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.embedded_image_list.image_type 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].image_type = (bcmolt_device_image_type) cli_parm->values[i0].enum_val;
            }
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.embedded_image_list.image_size");
        if (cli_parm != NULL)
        {
            if (cli_parm->array_size != val.len)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.embedded_image_list.image_size 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].image_size = cli_parm->values[i0].unumber;
            }
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.embedded_image_list.crc32");
        if (cli_parm != NULL)
        {
            if (cli_parm->array_size != val.len)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.embedded_image_list.crc32 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].crc32 = cli_parm->values[i0].unumber;
            }
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.embedded_image_list.status");
        if (cli_parm != NULL)
        {
            if (cli_parm->array_size != val.len)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.embedded_image_list.status 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].status = (bcmolt_embedded_image_transfer_status) cli_parm->values[i0].enum_val;
            }
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.embedded_image_list.image_name");
        if (cli_parm != NULL)
        {
            if (cli_parm->array_size != val.len)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.embedded_image_list.image_name is a different size than other arrays in the struct\n");
                return BCM_ERR_PARM;
            }

            for (i0 = 0; i0 < val.len; i0++)
            {
                snprintf(val.val[i0].image_name, 64, "%s", cli_parm->values[i0].string);
            }
        }

        BCMOLT_CFG_PROP_SET(&cfg, device, embedded_image_list, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_embedded_image_entry_list_u8 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEVICE_CFG_ID_EMBEDDED_IMAGE_LIST, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, device, embedded_image_list, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "embedded_image_list");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, embedded_image_list);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, embedded_image_list);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.chip_voltage");
    if (cli_parm != NULL)
    {
        uint32_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, device, chip_voltage, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, device, chip_voltage, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEVICE_CFG_ID_CHIP_VOLTAGE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "chip_voltage");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, chip_voltage);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, chip_voltage);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.epon_tod_string.");
    if (cli_parm != NULL)
    {
        bcmolt_str_256 val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.epon_tod_string.str");
        if (cli_parm != NULL)
        {
            snprintf(val.str, 256, "%s", cli_parm->value.string);
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.epon_tod_string.str is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, device, epon_tod_string, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_str_256 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEVICE_CFG_ID_EPON_TOD_STRING, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, device, epon_tod_string, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "epon_tod_string");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, epon_tod_string);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, epon_tod_string);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.xgpon_num_of_onus");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_num_of_onus val;
        val = (bcmolt_xgpon_num_of_onus) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, device, xgpon_num_of_onus, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, device, xgpon_num_of_onus, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEVICE_CFG_ID_XGPON_NUM_OF_ONUS, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "xgpon_num_of_onus");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, xgpon_num_of_onus);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, xgpon_num_of_onus);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.device_ip_address");
    if (cli_parm != NULL)
    {
        bcmos_ipv4_address val;
        val = apicli_unumber_to_ipv4(cli_parm->value.unumber);
        BCMOLT_CFG_PROP_SET(&cfg, device, device_ip_address, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, device, device_ip_address, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEVICE_CFG_ID_DEVICE_IP_ADDRESS, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "device_ip_address");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, device_ip_address);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, device_ip_address);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.device_udp_port");
    if (cli_parm != NULL)
    {
        uint16_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, device, device_udp_port, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, device, device_udp_port, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEVICE_CFG_ID_DEVICE_UDP_PORT, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "device_udp_port");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, device_udp_port);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, device_udp_port);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.tod_uart_baudrate");
    if (cli_parm != NULL)
    {
        bcmolt_uart_baudrate val;
        val = (bcmolt_uart_baudrate) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, device, tod_uart_baudrate, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, device, tod_uart_baudrate, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEVICE_CFG_ID_TOD_UART_BAUDRATE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "tod_uart_baudrate");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, tod_uart_baudrate);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, tod_uart_baudrate);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.gpon_xgpon_tod_string_length");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, device, gpon_xgpon_tod_string_length, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, device, gpon_xgpon_tod_string_length, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_DEVICE_CFG_ID_GPON_XGPON_TOD_STRING_LENGTH, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "gpon_xgpon_tod_string_length");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, gpon_xgpon_tod_string_length);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, gpon_xgpon_tod_string_length);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, device, system_mode) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, device, keepalive_interval) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, device, keepalive_tolerance) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, device, firmware_sw_version) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, device, host_sw_version) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, device, chip_revision) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, device, state) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, device, debug) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, device, nni_speed) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, device, protection_switching_ext_irq) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, device, epon_clock_transport_sample_delay) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, device, indication_shaping) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, device, chip_temperature) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, device, gpon_xgpon_tod_enable) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, device, gpon_xgpon_tod_gpio_pin) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, device, gpon_xgpon_tod_connected_internally) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, device, epon_8021_as_tod_format) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, device, epon_shaper_mode) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, device, embedded_image_list) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, device, chip_voltage) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, device, epon_tod_string) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, device, xgpon_num_of_onus) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, device, device_ip_address) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, device, device_udp_port) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, device, tod_uart_baudrate) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, device, gpon_xgpon_tod_string_length))
    {
        BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, all_properties);
        bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, device, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);
    bcmcli_log("bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_device_oper_connect_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmos_errno err;
    bcmolt_device_connect oper;     /**< declare main API struct */
    bcmolt_device_key key = { };    /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_device_connect oper;\n");
    bcmcli_log("bcmolt_device_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, device, connect, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, device, connect, key);\n");

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_device_oper_disconnect_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmos_errno err;
    bcmolt_device_disconnect oper;  /**< declare main API struct */
    bcmolt_device_key key = { };    /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_device_disconnect oper;\n");
    bcmcli_log("bcmolt_device_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, device, disconnect, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, device, disconnect, key);\n");

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_device_oper_reset_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_device_reset oper;       /**< declare main API struct */
    bcmolt_device_key key = { };    /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_device_reset oper;\n");
    bcmcli_log("bcmolt_device_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, device, reset, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, device, reset, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "mode");
    if (cli_parm != NULL)
    {
        bcmolt_device_reset_mode val;
        val = (bcmolt_device_reset_mode) cli_parm->value.enum_val;
        BCMOLT_OPER_PROP_SET(&oper, device, reset, mode, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, device, reset, mode, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_OPER, BCMOLT_DEVICE_OPER_ID_RESET, BCMOLT_DEVICE_RESET_ID_MODE, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_device_oper_host_keep_alive_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_device_host_keep_alive oper; /**< declare main API struct */
    bcmolt_device_key key = { };        /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_device_host_keep_alive oper;\n");
    bcmcli_log("bcmolt_device_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, device, host_keep_alive, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, device, host_keep_alive, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "sequence_number");
    if (cli_parm != NULL)
    {
        uint32_t val;
        val = cli_parm->value.unumber;
        BCMOLT_OPER_PROP_SET(&oper, device, host_keep_alive, sequence_number, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, device, host_keep_alive, sequence_number, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_OPER, BCMOLT_DEVICE_OPER_ID_HOST_KEEP_ALIVE, BCMOLT_DEVICE_HOST_KEEP_ALIVE_ID_SEQUENCE_NUMBER, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "time_stamp");
    if (cli_parm != NULL)
    {
        uint32_t val;
        val = cli_parm->value.unumber;
        BCMOLT_OPER_PROP_SET(&oper, device, host_keep_alive, time_stamp, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, device, host_keep_alive, time_stamp, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_OPER, BCMOLT_DEVICE_OPER_ID_HOST_KEEP_ALIVE, BCMOLT_DEVICE_HOST_KEEP_ALIVE_ID_TIME_STAMP, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_device_oper_sw_upgrade_activate_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmos_errno err;
    bcmolt_device_sw_upgrade_activate oper; /**< declare main API struct */
    bcmolt_device_key key = { };            /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_device_sw_upgrade_activate oper;\n");
    bcmcli_log("bcmolt_device_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, device, sw_upgrade_activate, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, device, sw_upgrade_activate, key);\n");

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_device_oper_image_transfer_start_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_device_image_transfer_start oper;    /**< declare main API struct */
    bcmolt_device_key key = { };                /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_device_image_transfer_start oper;\n");
    bcmcli_log("bcmolt_device_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, device, image_transfer_start, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, device, image_transfer_start, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "image_type");
    if (cli_parm != NULL)
    {
        bcmolt_device_image_type val;
        val = (bcmolt_device_image_type) cli_parm->value.enum_val;
        BCMOLT_OPER_PROP_SET(&oper, device, image_transfer_start, image_type, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, device, image_transfer_start, image_type, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_OPER, BCMOLT_DEVICE_OPER_ID_IMAGE_TRANSFER_START, BCMOLT_DEVICE_IMAGE_TRANSFER_START_ID_IMAGE_TYPE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "image_size");
    if (cli_parm != NULL)
    {
        uint32_t val;
        val = cli_parm->value.unumber;
        BCMOLT_OPER_PROP_SET(&oper, device, image_transfer_start, image_size, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, device, image_transfer_start, image_size, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_OPER, BCMOLT_DEVICE_OPER_ID_IMAGE_TRANSFER_START, BCMOLT_DEVICE_IMAGE_TRANSFER_START_ID_IMAGE_SIZE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "crc32");
    if (cli_parm != NULL)
    {
        uint32_t val;
        val = cli_parm->value.unumber;
        BCMOLT_OPER_PROP_SET(&oper, device, image_transfer_start, crc32, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, device, image_transfer_start, crc32, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_OPER, BCMOLT_DEVICE_OPER_ID_IMAGE_TRANSFER_START, BCMOLT_DEVICE_IMAGE_TRANSFER_START_ID_CRC32, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "image_name.");
    if (cli_parm != NULL)
    {
        bcmolt_str_64 val = { };
        cli_parm = bcmcli_find_named_parm(session, "image_name.str");
        if (cli_parm != NULL)
        {
            snprintf(val.str, 64, "%s", cli_parm->value.string);
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "image_name.str is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_OPER_PROP_SET(&oper, device, image_transfer_start, image_name, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_str_64 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_OPER, BCMOLT_DEVICE_OPER_ID_IMAGE_TRANSFER_START, BCMOLT_DEVICE_IMAGE_TRANSFER_START_ID_IMAGE_NAME, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, device, image_transfer_start, image_name, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_device_oper_image_transfer_data_submit(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_device_image_transfer_data oper; /**< declare main API struct */
    bcmolt_device_key key = { };            /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_device_image_transfer_data oper;\n");
    bcmcli_log("bcmolt_device_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, device, image_transfer_data, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, device, image_transfer_data, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "block_number");
    if (cli_parm != NULL)
    {
        uint32_t val;
        val = cli_parm->value.unumber;
        BCMOLT_OPER_PROP_SET(&oper, device, image_transfer_data, block_number, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, device, image_transfer_data, block_number, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_OPER, BCMOLT_DEVICE_OPER_ID_IMAGE_TRANSFER_DATA, BCMOLT_DEVICE_IMAGE_TRANSFER_DATA_ID_BLOCK_NUMBER, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "more_data");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_OPER_PROP_SET(&oper, device, image_transfer_data, more_data, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, device, image_transfer_data, more_data, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_OPER, BCMOLT_DEVICE_OPER_ID_IMAGE_TRANSFER_DATA, BCMOLT_DEVICE_IMAGE_TRANSFER_DATA_ID_MORE_DATA, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "data");
    if (cli_parm != NULL)
    {
        bcmolt_u8_list_u16_hex val = { };
        val.len = bcmolt_buf_get_used(&cli_parm->value.buffer);
        val.val = apicli_byte_pool_calloc(byte_pool, val.len);
        if (val.val == NULL)
        {
            apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
            return BCM_ERR_NOMEM;
        }

        bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
        bcmolt_buf_read(&cli_parm->value.buffer, val.val, val.len);
        BCMOLT_OPER_PROP_SET(&oper, device, image_transfer_data, data, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_u8_list_u16_hex val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_OPER, BCMOLT_DEVICE_OPER_ID_IMAGE_TRANSFER_DATA, BCMOLT_DEVICE_IMAGE_TRANSFER_DATA_ID_DATA, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, device, image_transfer_data, data, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_device_oper_run_ddr_test_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_device_run_ddr_test oper;    /**< declare main API struct */
    bcmolt_device_key key = { };        /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_device_run_ddr_test oper;\n");
    bcmcli_log("bcmolt_device_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, device, run_ddr_test, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, device, run_ddr_test, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "cpu");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_OPER_PROP_SET(&oper, device, run_ddr_test, cpu, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, device, run_ddr_test, cpu, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_OPER, BCMOLT_DEVICE_OPER_ID_RUN_DDR_TEST, BCMOLT_DEVICE_RUN_DDR_TEST_ID_CPU, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "ras_0");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_OPER_PROP_SET(&oper, device, run_ddr_test, ras_0, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, device, run_ddr_test, ras_0, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_OPER, BCMOLT_DEVICE_OPER_ID_RUN_DDR_TEST, BCMOLT_DEVICE_RUN_DDR_TEST_ID_RAS_0, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "ras_1");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_OPER_PROP_SET(&oper, device, run_ddr_test, ras_1, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, device, run_ddr_test, ras_1, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_OPER, BCMOLT_DEVICE_OPER_ID_RUN_DDR_TEST, BCMOLT_DEVICE_RUN_DDR_TEST_ID_RAS_1, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_device_auto_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_device_auto_cfg auto_cfg;    /**< declare main API struct */
    bcmolt_device_key key = { };        /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_device_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_device_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_get");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, device, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, device, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "connection_complete");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, device, connection_complete);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, device, connection_complete);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "connection_established");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, device, connection_established);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, device, connection_established);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "connection_failure");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, device, connection_failure);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, device, connection_failure);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "ddr_test_complete");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, device, ddr_test_complete);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, device, ddr_test_complete);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "device_keep_alive");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, device, device_keep_alive);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, device, device_keep_alive);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "device_ready");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, device, device_ready);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, device, device_ready);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "disconnection_complete");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, device, disconnection_complete);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, device, disconnection_complete);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "image_transfer_complete");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, device, image_transfer_complete);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, device, image_transfer_complete);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "indications_dropped");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, device, indications_dropped);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, device, indications_dropped);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "sw_error");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, device, sw_error);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, device, sw_error);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "sw_exception");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, device, sw_exception);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, device, sw_exception);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, device, connection_complete) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, device, connection_established) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, device, connection_failure) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, device, ddr_test_complete) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, device, device_keep_alive) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, device, device_ready) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, device, disconnection_complete) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, device, image_transfer_complete) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, device, indications_dropped) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, device, sw_error) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, device, sw_exception))
    {
        BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, device, all_properties);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, device, all_properties);\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &auto_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_device_auto_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_device_auto_cfg auto_cfg;    /**< declare main API struct */
    bcmolt_device_key key = { };        /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_device_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_device_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_set");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, device, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, device, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "connection_complete");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, device, connection_complete, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, device, connection_complete, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_DEVICE_AUTO_CFG_ID_CONNECTION_COMPLETE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "connection_established");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, device, connection_established, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, device, connection_established, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_DEVICE_AUTO_CFG_ID_CONNECTION_ESTABLISHED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "connection_failure");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, device, connection_failure, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, device, connection_failure, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_DEVICE_AUTO_CFG_ID_CONNECTION_FAILURE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "ddr_test_complete");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, device, ddr_test_complete, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, device, ddr_test_complete, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_DEVICE_AUTO_CFG_ID_DDR_TEST_COMPLETE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "device_keep_alive");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, device, device_keep_alive, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, device, device_keep_alive, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_DEVICE_AUTO_CFG_ID_DEVICE_KEEP_ALIVE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "device_ready");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, device, device_ready, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, device, device_ready, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_DEVICE_AUTO_CFG_ID_DEVICE_READY, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "disconnection_complete");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, device, disconnection_complete, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, device, disconnection_complete, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_DEVICE_AUTO_CFG_ID_DISCONNECTION_COMPLETE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "image_transfer_complete");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, device, image_transfer_complete, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, device, image_transfer_complete, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_DEVICE_AUTO_CFG_ID_IMAGE_TRANSFER_COMPLETE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "indications_dropped");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, device, indications_dropped, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, device, indications_dropped, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_DEVICE_AUTO_CFG_ID_INDICATIONS_DROPPED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "sw_error");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, device, sw_error, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, device, sw_error, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_DEVICE_AUTO_CFG_ID_SW_ERROR, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "sw_exception");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, device, sw_exception, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, device, sw_exception, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_DEVICE_AUTO_CFG_ID_SW_EXCEPTION, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);\n");
    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_denied_link_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_denied_link_cfg cfg;        /**< declare main API struct */
    bcmolt_epon_denied_link_key key = { };  /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_denied_link_cfg cfg;\n");
    bcmcli_log("bcmolt_epon_denied_link_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_DENIED_LINK, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_DENIED_LINK_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "mac_address");
    if (cli_parm != NULL)
    {
        key.mac_address = cli_parm->value.mac;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "mac_address is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.mac_address = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_DENIED_LINK, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_DENIED_LINK_KEY_ID_MAC_ADDRESS, &key.mac_address);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, epon_denied_link, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, epon_denied_link, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "alarm_state");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_denied_link, alarm_state);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_denied_link, alarm_state);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_CFG_PROP_IS_SET(&cfg, epon_denied_link, alarm_state))
    {
        BCMOLT_CFG_PROP_GET(&cfg, epon_denied_link, all_properties);
        bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_denied_link, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_get(device_id, &cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_denied_link_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_denied_link_cfg cfg;        /**< declare main API struct */
    bcmolt_epon_denied_link_key key = { };  /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_denied_link_cfg cfg;\n");
    bcmcli_log("bcmolt_epon_denied_link_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_DENIED_LINK, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_DENIED_LINK_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "mac_address");
    if (cli_parm != NULL)
    {
        key.mac_address = cli_parm->value.mac;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "mac_address is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.mac_address = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_DENIED_LINK, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_DENIED_LINK_KEY_ID_MAC_ADDRESS, &key.mac_address);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, epon_denied_link, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, epon_denied_link, key);\n");

    /* decode API parameters from CLI */

    /* call API */
    err = bcmolt_cfg_set(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_set(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_denied_link_cfg_clear(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_denied_link_cfg cfg;        /**< declare main API struct */
    bcmolt_epon_denied_link_key key = { };  /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_denied_link_cfg cfg;\n");
    bcmcli_log("bcmolt_epon_denied_link_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_clear");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_DENIED_LINK, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_DENIED_LINK_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "mac_address");
    if (cli_parm != NULL)
    {
        key.mac_address = cli_parm->value.mac;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "mac_address is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.mac_address = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_DENIED_LINK, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_DENIED_LINK_KEY_ID_MAC_ADDRESS, &key.mac_address);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, epon_denied_link, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, epon_denied_link, key);\n");

    /* call API */
    err = bcmolt_cfg_clear(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_clear(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_denied_link_cfg_get_multi(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_denied_link_cfg cfg;        /**< declare main API struct */
    bcmolt_epon_denied_link_key key = { };  /**< declare key */
    bcmolt_msg_set *msg_set = NULL;         /**< declare message set */
    uint32_t max_msgs;                      /**< declare max number of msgs to get */
    bcmos_bool invert_filter;               /**< declare filter invert flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_denied_link_cfg cfg;\n");
    bcmcli_log("bcmolt_epon_denied_link_key key = {  };\n");
    bcmcli_log("bcmolt_msg_set* msg_set = NULL;\n");
    bcmcli_log("uint32_t max_msgs;\n");
    bcmcli_log("bcmos_bool invert_filter;\n");
    apicli_print_start(session, "bcmolt_cfg_get_multi");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_DENIED_LINK, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_DENIED_LINK_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "mac_address");
    if (cli_parm != NULL)
    {
        key.mac_address = cli_parm->value.mac;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "mac_address is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.mac_address = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_DENIED_LINK, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_DENIED_LINK_KEY_ID_MAC_ADDRESS, &key.mac_address);
    bcmcli_log(";\n");

    /* set max number of msgs from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "max_msgs");
    if (cli_parm != NULL)
    {
        max_msgs = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "max_msgs is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("max_msgs = %d;\n", max_msgs);

    /* set filter invert flag from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "filter_invert");
    if (cli_parm != NULL)
    {
        invert_filter = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "filter_invert is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("invert_filter = %s;\n", (invert_filter) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* allocate message set */
    err = apicli_msg_set_alloc(byte_pool, BCMOLT_OBJ_ID_EPON_DENIED_LINK, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);
    if (err != BCM_ERR_OK)
    {
        return err;
    }

    bcmcli_log("bcmolt_msg_set_alloc(BCMOLT_OBJ_ID_EPON_DENIED_LINK, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, epon_denied_link, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, epon_denied_link, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.alarm_state.");
    if (cli_parm != NULL)
    {
        bcmolt_epon_denied_link_alarm_state val = { };
        cli_parm = bcmcli_find_parm_by_prefix(session, "filter.alarm_state.unknown_link_violation.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "filter.alarm_state.unknown_link_violation.link_rate");
            if (cli_parm != NULL)
            {
                val.unknown_link_violation.link_rate = (bcmolt_epon_link_rate) cli_parm->value.enum_val;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.unknown_link_violation.link_rate is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.alarm_state.unknown_link_violation.alarm_status");
            if (cli_parm != NULL)
            {
                val.unknown_link_violation.alarm_status = (bcmolt_status) cli_parm->value.enum_val;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.unknown_link_violation.alarm_status is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.unknown_link_violation is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.alarm_state.overhead_profile_violation");
        if (cli_parm != NULL)
        {
            val.overhead_profile_violation = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.overhead_profile_violation is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.alarm_state.max_link_violation");
        if (cli_parm != NULL)
        {
            val.max_link_violation = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.max_link_violation is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.alarm_state.llid_pool_empty_violation");
        if (cli_parm != NULL)
        {
            val.llid_pool_empty_violation = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.llid_pool_empty_violation is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "filter.alarm_state.laser_on_off_violation.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "filter.alarm_state.laser_on_off_violation.laser_on_time");
            if (cli_parm != NULL)
            {
                val.laser_on_off_violation.laser_on_time = (bcmolt_time_quanta) cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.laser_on_off_violation.laser_on_time is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.alarm_state.laser_on_off_violation.laser_off_time");
            if (cli_parm != NULL)
            {
                val.laser_on_off_violation.laser_off_time = (bcmolt_time_quanta) cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.laser_on_off_violation.laser_off_time is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.alarm_state.laser_on_off_violation.alarm_status");
            if (cli_parm != NULL)
            {
                val.laser_on_off_violation.alarm_status = (bcmolt_status) cli_parm->value.enum_val;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.laser_on_off_violation.alarm_status is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.laser_on_off_violation is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.alarm_state.system_resource_violation");
        if (cli_parm != NULL)
        {
            val.system_resource_violation = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.system_resource_violation is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "filter.alarm_state.range_violation.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "filter.alarm_state.range_violation.range");
            if (cli_parm != NULL)
            {
                val.range_violation.range = (bcmolt_time_quanta) cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.range_violation.range is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.alarm_state.range_violation.alarm_status");
            if (cli_parm != NULL)
            {
                val.range_violation.alarm_status = (bcmolt_status) cli_parm->value.enum_val;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.range_violation.alarm_status is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.range_violation is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.alarm_state.tdm_channels_exhausted");
        if (cli_parm != NULL)
        {
            val.tdm_channels_exhausted = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.tdm_channels_exhausted is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "filter.alarm_state.rogue_violation.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "filter.alarm_state.rogue_violation.denied_llid");
            if (cli_parm != NULL)
            {
                val.rogue_violation.denied_llid = (bcmolt_epon_llid) cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.rogue_violation.denied_llid is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.alarm_state.rogue_violation.denied_range");
            if (cli_parm != NULL)
            {
                val.rogue_violation.denied_range = (bcmolt_time_quanta) cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.rogue_violation.denied_range is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.alarm_state.rogue_violation.alarm_status");
            if (cli_parm != NULL)
            {
                val.rogue_violation.alarm_status = (bcmolt_status) cli_parm->value.enum_val;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.rogue_violation.alarm_status is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.rogue_violation is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.alarm_state.upstream_bandwidth_violation");
        if (cli_parm != NULL)
        {
            val.upstream_bandwidth_violation = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.upstream_bandwidth_violation is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_denied_link, alarm_state, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_epon_denied_link_alarm_state val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_DENIED_LINK, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_DENIED_LINK_CFG_ID_ALARM_STATE, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_denied_link, alarm_state, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "alarm_state");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_denied_link, alarm_state);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_denied_link, alarm_state);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_denied_link, alarm_state))
    {
        BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_denied_link, all_properties);
        bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_denied_link, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);
    bcmcli_log("bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_denied_link_auto_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_denied_link_auto_cfg auto_cfg;  /**< declare main API struct */
    bcmolt_epon_denied_link_key key = { };      /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_denied_link_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_epon_denied_link_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_get");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, epon_denied_link, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, epon_denied_link, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "laser_on_off_violation");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_denied_link, laser_on_off_violation);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_denied_link, laser_on_off_violation);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "llid_pool_empty_violation");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_denied_link, llid_pool_empty_violation);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_denied_link, llid_pool_empty_violation);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "max_link_violation");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_denied_link, max_link_violation);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_denied_link, max_link_violation);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "overhead_profile_violation");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_denied_link, overhead_profile_violation);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_denied_link, overhead_profile_violation);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "range_violation");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_denied_link, range_violation);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_denied_link, range_violation);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rogue_violation");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_denied_link, rogue_violation);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_denied_link, rogue_violation);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "system_resource_violation");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_denied_link, system_resource_violation);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_denied_link, system_resource_violation);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tdm_channels_exhausted");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_denied_link, tdm_channels_exhausted);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_denied_link, tdm_channels_exhausted);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "unknown_link_violation");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_denied_link, unknown_link_violation);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_denied_link, unknown_link_violation);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "upstream_bandwidth_violation");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_denied_link, upstream_bandwidth_violation);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_denied_link, upstream_bandwidth_violation);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_denied_link, laser_on_off_violation) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_denied_link, llid_pool_empty_violation) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_denied_link, max_link_violation) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_denied_link, overhead_profile_violation) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_denied_link, range_violation) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_denied_link, rogue_violation) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_denied_link, system_resource_violation) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_denied_link, tdm_channels_exhausted) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_denied_link, unknown_link_violation) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_denied_link, upstream_bandwidth_violation))
    {
        BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_denied_link, all_properties);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_denied_link, all_properties);\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &auto_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_denied_link_auto_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_denied_link_auto_cfg auto_cfg;  /**< declare main API struct */
    bcmolt_epon_denied_link_key key = { };      /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_denied_link_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_epon_denied_link_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_set");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, epon_denied_link, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, epon_denied_link, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "laser_on_off_violation");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_denied_link, laser_on_off_violation, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_denied_link, laser_on_off_violation, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_DENIED_LINK, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_LASER_ON_OFF_VIOLATION, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "llid_pool_empty_violation");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_denied_link, llid_pool_empty_violation, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_denied_link, llid_pool_empty_violation, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_DENIED_LINK, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_LLID_POOL_EMPTY_VIOLATION, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "max_link_violation");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_denied_link, max_link_violation, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_denied_link, max_link_violation, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_DENIED_LINK, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_MAX_LINK_VIOLATION, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "overhead_profile_violation");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_denied_link, overhead_profile_violation, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_denied_link, overhead_profile_violation, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_DENIED_LINK, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_OVERHEAD_PROFILE_VIOLATION, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "range_violation");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_denied_link, range_violation, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_denied_link, range_violation, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_DENIED_LINK, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_RANGE_VIOLATION, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rogue_violation");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_denied_link, rogue_violation, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_denied_link, rogue_violation, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_DENIED_LINK, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_ROGUE_VIOLATION, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "system_resource_violation");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_denied_link, system_resource_violation, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_denied_link, system_resource_violation, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_DENIED_LINK, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_SYSTEM_RESOURCE_VIOLATION, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "tdm_channels_exhausted");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_denied_link, tdm_channels_exhausted, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_denied_link, tdm_channels_exhausted, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_DENIED_LINK, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_TDM_CHANNELS_EXHAUSTED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "unknown_link_violation");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_denied_link, unknown_link_violation, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_denied_link, unknown_link_violation, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_DENIED_LINK, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_UNKNOWN_LINK_VIOLATION, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "upstream_bandwidth_violation");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_denied_link, upstream_bandwidth_violation, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_denied_link, upstream_bandwidth_violation, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_DENIED_LINK, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_UPSTREAM_BANDWIDTH_VIOLATION, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);\n");
    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_link_cfg_get(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_link_cfg cfg;       /**< declare main API struct */
    bcmolt_epon_link_key key = { }; /**< declare key */
    uint8_t *list_mem;              /**< declare memory buffer for variable-sized lists */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_link_cfg cfg;\n");
    bcmcli_log("bcmolt_epon_link_key key = {  };\n");
    bcmcli_log("uint8_t* list_mem;\n");
    apicli_print_start(session, "bcmolt_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_LINK_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "mac_address");
    if (cli_parm != NULL)
    {
        key.mac_address = cli_parm->value.mac;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "mac_address is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.mac_address = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_LINK_KEY_ID_MAC_ADDRESS, &key.mac_address);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, epon_link, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, epon_link, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "link_rate");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_link, link_rate);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_link, link_rate);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "state_flags");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_link, state_flags);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_link, state_flags);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "llid");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_link, llid);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_link, llid);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "laser_on_time_tq");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_link, laser_on_time_tq);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_link, laser_on_time_tq);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "laser_off_time_tq");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_link, laser_off_time_tq);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_link, laser_off_time_tq);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "range_value_tq");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_link, range_value_tq);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_link, range_value_tq);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "distance");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_link, distance);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_link, distance);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "alarm_state");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_link, alarm_state);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_link, alarm_state);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tunnel_id");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_link, tunnel_id);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_link, tunnel_id);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_link, onu_id);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_link, onu_id);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "min_laser_overhead");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_link, min_laser_overhead);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_link, min_laser_overhead);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "key_exchange_config");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_link, key_exchange_config);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_link, key_exchange_config);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "epon_encryption");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_link, epon_encryption);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_link, epon_encryption);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "fec_enable");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_link, fec_enable);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_link, fec_enable);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "oam_heartbeat_config");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_link, oam_heartbeat_config);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_link, oam_heartbeat_config);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "upstream_bandwidth");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_link, upstream_bandwidth);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_link, upstream_bandwidth);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "ubd_info");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_link, ubd_info);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_link, ubd_info);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "clock_transport_enable");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_link, clock_transport_enable);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_link, clock_transport_enable);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "pending_grants");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_link, pending_grants);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_link, pending_grants);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "link_type");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_link, link_type);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_link, link_type);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_CFG_PROP_IS_SET(&cfg, epon_link, link_rate) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_link, state_flags) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_link, llid) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_link, laser_on_time_tq) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_link, laser_off_time_tq) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_link, range_value_tq) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_link, distance) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_link, alarm_state) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_link, tunnel_id) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_link, onu_id) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_link, min_laser_overhead) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_link, key_exchange_config) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_link, epon_encryption) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_link, fec_enable) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_link, oam_heartbeat_config) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_link, upstream_bandwidth) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_link, ubd_info) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_link, clock_transport_enable) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_link, pending_grants) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_link, link_type))
    {
        BCMOLT_CFG_PROP_GET(&cfg, epon_link, all_properties);
        bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_link, all_properties);\n");
    }

    /* set memory to use for variable-sized lists */
    list_mem = apicli_byte_pool_calloc(byte_pool, APICLI_DYNAMIC_LIST_BUFFER_SIZE);
    if (list_mem == NULL)
    {
        apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
        return BCM_ERR_NOMEM;
    }

    bcmcli_log("list_mem = bcmos_calloc(APICLI_DYNAMIC_LIST_BUFFER_SIZE);\n");
    BCMOLT_CFG_LIST_BUF_SET(&cfg, epon_link, list_mem, APICLI_DYNAMIC_LIST_BUFFER_SIZE);
    bcmcli_log("BCMOLT_CFG_LIST_BUF_SET(&cfg, epon_link, list_mem, APICLI_DYNAMIC_LIST_BUFFER_SIZE);\n");

    /* call API */
    err = bcmolt_cfg_get(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_get(device_id, &cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_link_cfg_set(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_link_cfg cfg;       /**< declare main API struct */
    bcmolt_epon_link_key key = { }; /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_link_cfg cfg;\n");
    bcmcli_log("bcmolt_epon_link_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_LINK_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "mac_address");
    if (cli_parm != NULL)
    {
        key.mac_address = cli_parm->value.mac;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "mac_address is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.mac_address = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_LINK_KEY_ID_MAC_ADDRESS, &key.mac_address);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, epon_link, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, epon_link, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "tunnel_id");
    if (cli_parm != NULL)
    {
        bcmolt_epon_tunnel_id val;
        val = (bcmolt_epon_tunnel_id) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, epon_link, tunnel_id, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_link, tunnel_id, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_LINK_CFG_ID_TUNNEL_ID, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        bcmolt_epon_onu_id val;
        val = (bcmolt_epon_onu_id) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, epon_link, onu_id, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_link, onu_id, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_LINK_CFG_ID_ONU_ID, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "min_laser_overhead.");
    if (cli_parm != NULL)
    {
        bcmolt_epon_laser_overhead_parameters val = { };
        cli_parm = bcmcli_find_named_parm(session, "min_laser_overhead.laser_on_time");
        if (cli_parm != NULL)
        {
            val.laser_on_time = (bcmolt_time_quanta) cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "min_laser_overhead.laser_on_time is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "min_laser_overhead.laser_off_time");
        if (cli_parm != NULL)
        {
            val.laser_off_time = (bcmolt_time_quanta) cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "min_laser_overhead.laser_off_time is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_link, min_laser_overhead, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_epon_laser_overhead_parameters val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_LINK_CFG_ID_MIN_LASER_OVERHEAD, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_link, min_laser_overhead, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "key_exchange_config.");
    if (cli_parm != NULL)
    {
        bcmolt_epon_key_exchange_config val = { };
        cli_parm = bcmcli_find_named_parm(session, "key_exchange_config.oam_type");
        if (cli_parm != NULL)
        {
            val.oam_type = (bcmolt_epon_oam_type) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "key_exchange_config.oam_type is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "key_exchange_config.period");
        if (cli_parm != NULL)
        {
            val.period = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "key_exchange_config.period is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "key_exchange_config.direction");
        if (cli_parm != NULL)
        {
            val.direction = (bcmolt_epon_encryption_direction) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "key_exchange_config.direction is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_link, key_exchange_config, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_epon_key_exchange_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_LINK_CFG_ID_KEY_EXCHANGE_CONFIG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_link, key_exchange_config, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "epon_encryption.");
    if (cli_parm != NULL)
    {
        bcmolt_epon_encryption_config val = { };
        cli_parm = bcmcli_find_named_parm(session, "epon_encryption.downstream_mode");
        if (cli_parm != NULL)
        {
            val.downstream_mode = (bcmolt_epon_encryption_mode) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "epon_encryption.downstream_mode is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "epon_encryption.downstream_key_choice");
        if (cli_parm != NULL)
        {
            val.downstream_key_choice = (bcmolt_epon_key_choice) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "epon_encryption.downstream_key_choice is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "epon_encryption.downstream_encryption_information.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "epon_encryption.downstream_encryption_information.format");
            if (cli_parm != NULL)
            {
                val.downstream_encryption_information.format = (bcmolt_epon_encryption_information_format) cli_parm->value.enum_val;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "epon_encryption.downstream_encryption_information.format is not set\n");
                return BCM_ERR_PARM;
            }

            switch (val.downstream_encryption_information.format)
            {
                case BCMOLT_EPON_ENCRYPTION_INFORMATION_FORMAT_CFB:
                    cli_parm = bcmcli_find_named_parm(session, "epon_encryption.downstream_encryption_information.key");
                    if (cli_parm != NULL)
                    {
                        if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 16)
                        {
                            apicli_print_complete(session, BCM_ERR_PARM, "buffer epon_encryption.downstream_encryption_information.key must have 16 bytes\n");
                            return BCM_ERR_PARM;
                        }

                        bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
                        bcmolt_buf_read(&cli_parm->value.buffer, val.downstream_encryption_information.u.cfb.key, 16);
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "epon_encryption.downstream_encryption_information.key is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_EPON_ENCRYPTION_INFORMATION_FORMAT_CTR:
                    cli_parm = bcmcli_find_named_parm(session, "epon_encryption.downstream_encryption_information.key");
                    if (cli_parm != NULL)
                    {
                        if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 16)
                        {
                            apicli_print_complete(session, BCM_ERR_PARM, "buffer epon_encryption.downstream_encryption_information.key must have 16 bytes\n");
                            return BCM_ERR_PARM;
                        }

                        bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
                        bcmolt_buf_read(&cli_parm->value.buffer, val.downstream_encryption_information.u.ctr.key, 16);
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "epon_encryption.downstream_encryption_information.key is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "epon_encryption.downstream_encryption_information.sci");
                    if (cli_parm != NULL)
                    {
                        if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 8)
                        {
                            apicli_print_complete(session, BCM_ERR_PARM, "buffer epon_encryption.downstream_encryption_information.sci must have 8 bytes\n");
                            return BCM_ERR_PARM;
                        }

                        bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
                        bcmolt_buf_read(&cli_parm->value.buffer, val.downstream_encryption_information.u.ctr.sci, 8);
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "epon_encryption.downstream_encryption_information.sci is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                default:
                    apicli_print_complete(session, BCM_ERR_RANGE, "\n");
                    return BCM_ERR_RANGE;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "epon_encryption.downstream_encryption_information is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "epon_encryption.upstream_mode");
        if (cli_parm != NULL)
        {
            val.upstream_mode = (bcmolt_epon_encryption_mode) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "epon_encryption.upstream_mode is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "epon_encryption.upstream_key_choice");
        if (cli_parm != NULL)
        {
            val.upstream_key_choice = (bcmolt_epon_key_choice) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "epon_encryption.upstream_key_choice is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "epon_encryption.upstream_encryption_information.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "epon_encryption.upstream_encryption_information.format");
            if (cli_parm != NULL)
            {
                val.upstream_encryption_information.format = (bcmolt_epon_encryption_information_format) cli_parm->value.enum_val;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "epon_encryption.upstream_encryption_information.format is not set\n");
                return BCM_ERR_PARM;
            }

            switch (val.upstream_encryption_information.format)
            {
                case BCMOLT_EPON_ENCRYPTION_INFORMATION_FORMAT_CFB:
                    cli_parm = bcmcli_find_named_parm(session, "epon_encryption.upstream_encryption_information.key");
                    if (cli_parm != NULL)
                    {
                        if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 16)
                        {
                            apicli_print_complete(session, BCM_ERR_PARM, "buffer epon_encryption.upstream_encryption_information.key must have 16 bytes\n");
                            return BCM_ERR_PARM;
                        }

                        bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
                        bcmolt_buf_read(&cli_parm->value.buffer, val.upstream_encryption_information.u.cfb.key, 16);
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "epon_encryption.upstream_encryption_information.key is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_EPON_ENCRYPTION_INFORMATION_FORMAT_CTR:
                    cli_parm = bcmcli_find_named_parm(session, "epon_encryption.upstream_encryption_information.key");
                    if (cli_parm != NULL)
                    {
                        if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 16)
                        {
                            apicli_print_complete(session, BCM_ERR_PARM, "buffer epon_encryption.upstream_encryption_information.key must have 16 bytes\n");
                            return BCM_ERR_PARM;
                        }

                        bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
                        bcmolt_buf_read(&cli_parm->value.buffer, val.upstream_encryption_information.u.ctr.key, 16);
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "epon_encryption.upstream_encryption_information.key is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "epon_encryption.upstream_encryption_information.sci");
                    if (cli_parm != NULL)
                    {
                        if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 8)
                        {
                            apicli_print_complete(session, BCM_ERR_PARM, "buffer epon_encryption.upstream_encryption_information.sci must have 8 bytes\n");
                            return BCM_ERR_PARM;
                        }

                        bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
                        bcmolt_buf_read(&cli_parm->value.buffer, val.upstream_encryption_information.u.ctr.sci, 8);
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "epon_encryption.upstream_encryption_information.sci is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                default:
                    apicli_print_complete(session, BCM_ERR_RANGE, "\n");
                    return BCM_ERR_RANGE;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "epon_encryption.upstream_encryption_information is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_link, epon_encryption, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_epon_encryption_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_LINK_CFG_ID_EPON_ENCRYPTION, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_link, epon_encryption, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "fec_enable.");
    if (cli_parm != NULL)
    {
        bcmolt_epon_link_fec_en val = { };
        cli_parm = bcmcli_find_named_parm(session, "fec_enable.upstream");
        if (cli_parm != NULL)
        {
            val.upstream = (bcmolt_epon_link_fec_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "fec_enable.upstream is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "fec_enable.downstream");
        if (cli_parm != NULL)
        {
            val.downstream = (bcmolt_epon_link_fec_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "fec_enable.downstream is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_link, fec_enable, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_epon_link_fec_en val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_LINK_CFG_ID_FEC_ENABLE, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_link, fec_enable, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "oam_heartbeat_config.");
    if (cli_parm != NULL)
    {
        bcmolt_oam_heartbeat_config val = { };
        cli_parm = bcmcli_find_named_parm(session, "oam_heartbeat_config.send_period");
        if (cli_parm != NULL)
        {
            val.send_period = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "oam_heartbeat_config.send_period is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "oam_heartbeat_config.transmit_frame");
        if (cli_parm != NULL)
        {
            val.transmit_frame.len = bcmolt_buf_get_used(&cli_parm->value.buffer);
            val.transmit_frame.val = apicli_byte_pool_calloc(byte_pool, val.transmit_frame.len);
            if (val.transmit_frame.val == NULL)
            {
                apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
                return BCM_ERR_NOMEM;
            }

            bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
            bcmolt_buf_read(&cli_parm->value.buffer, val.transmit_frame.val, val.transmit_frame.len);
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "oam_heartbeat_config.transmit_frame is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "oam_heartbeat_config.ignored_receive_frame_template.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "oam_heartbeat_config.ignored_receive_frame_template.frame_octets");
            if (cli_parm != NULL)
            {
                val.ignored_receive_frame_template.frame_octets.len = bcmolt_buf_get_used(&cli_parm->value.buffer);
                val.ignored_receive_frame_template.frame_octets.val = apicli_byte_pool_calloc(byte_pool, val.ignored_receive_frame_template.frame_octets.len);
                if (val.ignored_receive_frame_template.frame_octets.val == NULL)
                {
                    apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
                    return BCM_ERR_NOMEM;
                }

                bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
                bcmolt_buf_read(&cli_parm->value.buffer, val.ignored_receive_frame_template.frame_octets.val, val.ignored_receive_frame_template.frame_octets.len);
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "oam_heartbeat_config.ignored_receive_frame_template.frame_octets is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "oam_heartbeat_config.ignored_receive_frame_template.mask_octets");
            if (cli_parm != NULL)
            {
                val.ignored_receive_frame_template.mask_octets.len = bcmolt_buf_get_used(&cli_parm->value.buffer);
                val.ignored_receive_frame_template.mask_octets.val = apicli_byte_pool_calloc(byte_pool, val.ignored_receive_frame_template.mask_octets.len);
                if (val.ignored_receive_frame_template.mask_octets.val == NULL)
                {
                    apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
                    return BCM_ERR_NOMEM;
                }

                bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
                bcmolt_buf_read(&cli_parm->value.buffer, val.ignored_receive_frame_template.mask_octets.val, val.ignored_receive_frame_template.mask_octets.len);
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "oam_heartbeat_config.ignored_receive_frame_template.mask_octets is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "oam_heartbeat_config.ignored_receive_frame_template is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "oam_heartbeat_config.receive_timeout");
        if (cli_parm != NULL)
        {
            val.receive_timeout = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "oam_heartbeat_config.receive_timeout is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "oam_heartbeat_config.maximum_receive_size");
        if (cli_parm != NULL)
        {
            val.maximum_receive_size = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "oam_heartbeat_config.maximum_receive_size is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_link, oam_heartbeat_config, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_oam_heartbeat_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_LINK_CFG_ID_OAM_HEARTBEAT_CONFIG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_link, oam_heartbeat_config, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "upstream_bandwidth.");
    if (cli_parm != NULL)
    {
        bcmolt_upstream_bandwidth_distribution val = { };
        cli_parm = bcmcli_find_named_parm(session, "upstream_bandwidth.polling_interval_us");
        if (cli_parm != NULL)
        {
            val.polling_interval_us = (bcmolt_polling_interval) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "upstream_bandwidth.polling_interval_us is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "upstream_bandwidth.grant_threshold_tq");
        if (cli_parm != NULL)
        {
            val.grant_threshold_tq = (bcmolt_time_quanta) cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "upstream_bandwidth.grant_threshold_tq is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "upstream_bandwidth.min_schedulershaper.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "upstream_bandwidth.min_schedulershaper.bandwidth_Kbps");
            if (cli_parm != NULL)
            {
                val.min_schedulershaper.bandwidth_Kbps = (bcmolt_bandwidth_Kbps) cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "upstream_bandwidth.min_schedulershaper.bandwidth_Kbps is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "upstream_bandwidth.min_schedulershaper.max_burst_size_tq");
            if (cli_parm != NULL)
            {
                val.min_schedulershaper.max_burst_size_tq = (bcmolt_time_quanta) cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "upstream_bandwidth.min_schedulershaper.max_burst_size_tq is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "upstream_bandwidth.min_schedulershaper.priority");
            if (cli_parm != NULL)
            {
                val.min_schedulershaper.priority = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "upstream_bandwidth.min_schedulershaper.priority is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "upstream_bandwidth.min_schedulershaper.weight_tq");
            if (cli_parm != NULL)
            {
                val.min_schedulershaper.weight_tq = (bcmolt_time_quanta) cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "upstream_bandwidth.min_schedulershaper.weight_tq is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "upstream_bandwidth.min_schedulershaper is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "upstream_bandwidth.max_schedulershaper.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "upstream_bandwidth.max_schedulershaper.bandwidth_Kbps");
            if (cli_parm != NULL)
            {
                val.max_schedulershaper.bandwidth_Kbps = (bcmolt_bandwidth_Kbps) cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "upstream_bandwidth.max_schedulershaper.bandwidth_Kbps is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "upstream_bandwidth.max_schedulershaper.max_burst_size_tq");
            if (cli_parm != NULL)
            {
                val.max_schedulershaper.max_burst_size_tq = (bcmolt_time_quanta) cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "upstream_bandwidth.max_schedulershaper.max_burst_size_tq is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "upstream_bandwidth.max_schedulershaper.priority");
            if (cli_parm != NULL)
            {
                val.max_schedulershaper.priority = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "upstream_bandwidth.max_schedulershaper.priority is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "upstream_bandwidth.max_schedulershaper.weight_tq");
            if (cli_parm != NULL)
            {
                val.max_schedulershaper.weight_tq = (bcmolt_time_quanta) cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "upstream_bandwidth.max_schedulershaper.weight_tq is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "upstream_bandwidth.max_schedulershaper is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "upstream_bandwidth.tdm_grant_size_tq");
        if (cli_parm != NULL)
        {
            val.tdm_grant_size_tq = (bcmolt_time_quanta) cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "upstream_bandwidth.tdm_grant_size_tq is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "upstream_bandwidth.tdm_grant_interval_us");
        if (cli_parm != NULL)
        {
            val.tdm_grant_interval_us = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "upstream_bandwidth.tdm_grant_interval_us is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_link, upstream_bandwidth, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_upstream_bandwidth_distribution val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_LINK_CFG_ID_UPSTREAM_BANDWIDTH, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_link, upstream_bandwidth, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "clock_transport_enable");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, epon_link, clock_transport_enable, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_link, clock_transport_enable, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_LINK_CFG_ID_CLOCK_TRANSPORT_ENABLE, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_cfg_set(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_set(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_link_cfg_clear(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_link_cfg cfg;       /**< declare main API struct */
    bcmolt_epon_link_key key = { }; /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_link_cfg cfg;\n");
    bcmcli_log("bcmolt_epon_link_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_clear");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_LINK_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "mac_address");
    if (cli_parm != NULL)
    {
        key.mac_address = cli_parm->value.mac;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "mac_address is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.mac_address = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_LINK_KEY_ID_MAC_ADDRESS, &key.mac_address);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, epon_link, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, epon_link, key);\n");

    /* call API */
    err = bcmolt_cfg_clear(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_clear(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_link_cfg_get_multi(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_link_cfg cfg;       /**< declare main API struct */
    bcmolt_epon_link_key key = { }; /**< declare key */
    bcmolt_msg_set *msg_set = NULL; /**< declare message set */
    uint32_t max_msgs;              /**< declare max number of msgs to get */
    bcmos_bool invert_filter;       /**< declare filter invert flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_link_cfg cfg;\n");
    bcmcli_log("bcmolt_epon_link_key key = {  };\n");
    bcmcli_log("bcmolt_msg_set* msg_set = NULL;\n");
    bcmcli_log("uint32_t max_msgs;\n");
    bcmcli_log("bcmos_bool invert_filter;\n");
    apicli_print_start(session, "bcmolt_cfg_get_multi");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_LINK_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "mac_address");
    if (cli_parm != NULL)
    {
        key.mac_address = cli_parm->value.mac;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "mac_address is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.mac_address = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_LINK_KEY_ID_MAC_ADDRESS, &key.mac_address);
    bcmcli_log(";\n");

    /* set max number of msgs from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "max_msgs");
    if (cli_parm != NULL)
    {
        max_msgs = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "max_msgs is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("max_msgs = %d;\n", max_msgs);

    /* set filter invert flag from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "filter_invert");
    if (cli_parm != NULL)
    {
        invert_filter = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "filter_invert is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("invert_filter = %s;\n", (invert_filter) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* allocate message set */
    err = apicli_msg_set_alloc(byte_pool, BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);
    if (err != BCM_ERR_OK)
    {
        return err;
    }

    bcmcli_log("bcmolt_msg_set_alloc(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, epon_link, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, epon_link, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "filter.link_rate");
    if (cli_parm != NULL)
    {
        bcmolt_epon_link_rate val;
        val = (bcmolt_epon_link_rate) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, epon_link, link_rate, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_link, link_rate, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_LINK_CFG_ID_LINK_RATE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "link_rate");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_link, link_rate);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_link, link_rate);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.state_flags");
    if (cli_parm != NULL)
    {
        bcmolt_epon_link_state_flags val;
        val = (bcmolt_epon_link_state_flags) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, epon_link, state_flags, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_link, state_flags, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_LINK_CFG_ID_STATE_FLAGS, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "state_flags");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_link, state_flags);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_link, state_flags);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.llid");
    if (cli_parm != NULL)
    {
        bcmolt_epon_llid val;
        val = (bcmolt_epon_llid) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, epon_link, llid, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_link, llid, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_LINK_CFG_ID_LLID, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "llid");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_link, llid);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_link, llid);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.laser_on_time_tq");
    if (cli_parm != NULL)
    {
        bcmolt_time_quanta val;
        val = (bcmolt_time_quanta) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, epon_link, laser_on_time_tq, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_link, laser_on_time_tq, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_LINK_CFG_ID_LASER_ON_TIME_TQ, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "laser_on_time_tq");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_link, laser_on_time_tq);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_link, laser_on_time_tq);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.laser_off_time_tq");
    if (cli_parm != NULL)
    {
        bcmolt_time_quanta val;
        val = (bcmolt_time_quanta) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, epon_link, laser_off_time_tq, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_link, laser_off_time_tq, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_LINK_CFG_ID_LASER_OFF_TIME_TQ, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "laser_off_time_tq");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_link, laser_off_time_tq);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_link, laser_off_time_tq);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.range_value_tq");
    if (cli_parm != NULL)
    {
        bcmolt_time_quanta val;
        val = (bcmolt_time_quanta) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, epon_link, range_value_tq, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_link, range_value_tq, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_LINK_CFG_ID_RANGE_VALUE_TQ, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "range_value_tq");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_link, range_value_tq);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_link, range_value_tq);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.distance");
    if (cli_parm != NULL)
    {
        bcmolt_meters val;
        val = (bcmolt_meters) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, epon_link, distance, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_link, distance, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_LINK_CFG_ID_DISTANCE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "distance");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_link, distance);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_link, distance);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.alarm_state.");
    if (cli_parm != NULL)
    {
        bcmolt_epon_link_alarm_state val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.alarm_state.key_exchange_failure");
        if (cli_parm != NULL)
        {
            val.key_exchange_failure = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.key_exchange_failure is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.alarm_state.invalid_mpcp_report_received");
        if (cli_parm != NULL)
        {
            val.invalid_mpcp_report_received = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.invalid_mpcp_report_received is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.alarm_state.mpcp_report_timeout");
        if (cli_parm != NULL)
        {
            val.mpcp_report_timeout = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.mpcp_report_timeout is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.alarm_state.oam_keepalive_timeout");
        if (cli_parm != NULL)
        {
            val.oam_keepalive_timeout = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.oam_keepalive_timeout is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_link, alarm_state, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_epon_link_alarm_state val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_LINK_CFG_ID_ALARM_STATE, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_link, alarm_state, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "alarm_state");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_link, alarm_state);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_link, alarm_state);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.tunnel_id");
    if (cli_parm != NULL)
    {
        bcmolt_epon_tunnel_id val;
        val = (bcmolt_epon_tunnel_id) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, epon_link, tunnel_id, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_link, tunnel_id, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_LINK_CFG_ID_TUNNEL_ID, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "tunnel_id");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_link, tunnel_id);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_link, tunnel_id);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.onu_id");
    if (cli_parm != NULL)
    {
        bcmolt_epon_onu_id val;
        val = (bcmolt_epon_onu_id) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, epon_link, onu_id, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_link, onu_id, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_LINK_CFG_ID_ONU_ID, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_link, onu_id);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_link, onu_id);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.min_laser_overhead.");
    if (cli_parm != NULL)
    {
        bcmolt_epon_laser_overhead_parameters val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.min_laser_overhead.laser_on_time");
        if (cli_parm != NULL)
        {
            val.laser_on_time = (bcmolt_time_quanta) cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.min_laser_overhead.laser_on_time is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.min_laser_overhead.laser_off_time");
        if (cli_parm != NULL)
        {
            val.laser_off_time = (bcmolt_time_quanta) cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.min_laser_overhead.laser_off_time is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_link, min_laser_overhead, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_epon_laser_overhead_parameters val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_LINK_CFG_ID_MIN_LASER_OVERHEAD, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_link, min_laser_overhead, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "min_laser_overhead");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_link, min_laser_overhead);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_link, min_laser_overhead);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.key_exchange_config.");
    if (cli_parm != NULL)
    {
        bcmolt_epon_key_exchange_config val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.key_exchange_config.oam_type");
        if (cli_parm != NULL)
        {
            val.oam_type = (bcmolt_epon_oam_type) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.key_exchange_config.oam_type is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.key_exchange_config.period");
        if (cli_parm != NULL)
        {
            val.period = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.key_exchange_config.period is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.key_exchange_config.direction");
        if (cli_parm != NULL)
        {
            val.direction = (bcmolt_epon_encryption_direction) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.key_exchange_config.direction is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_link, key_exchange_config, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_epon_key_exchange_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_LINK_CFG_ID_KEY_EXCHANGE_CONFIG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_link, key_exchange_config, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "key_exchange_config");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_link, key_exchange_config);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_link, key_exchange_config);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.epon_encryption.");
    if (cli_parm != NULL)
    {
        bcmolt_epon_encryption_config val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.epon_encryption.downstream_mode");
        if (cli_parm != NULL)
        {
            val.downstream_mode = (bcmolt_epon_encryption_mode) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.epon_encryption.downstream_mode is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.epon_encryption.downstream_key_choice");
        if (cli_parm != NULL)
        {
            val.downstream_key_choice = (bcmolt_epon_key_choice) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.epon_encryption.downstream_key_choice is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "filter.epon_encryption.downstream_encryption_information.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "filter.epon_encryption.downstream_encryption_information.format");
            if (cli_parm != NULL)
            {
                val.downstream_encryption_information.format = (bcmolt_epon_encryption_information_format) cli_parm->value.enum_val;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.epon_encryption.downstream_encryption_information.format is not set\n");
                return BCM_ERR_PARM;
            }

            switch (val.downstream_encryption_information.format)
            {
                case BCMOLT_EPON_ENCRYPTION_INFORMATION_FORMAT_CFB:
                    cli_parm = bcmcli_find_named_parm(session, "filter.epon_encryption.downstream_encryption_information.key");
                    if (cli_parm != NULL)
                    {
                        if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 16)
                        {
                            apicli_print_complete(session, BCM_ERR_PARM, "buffer filter.epon_encryption.downstream_encryption_information.key must have 16 bytes\n");
                            return BCM_ERR_PARM;
                        }

                        bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
                        bcmolt_buf_read(&cli_parm->value.buffer, val.downstream_encryption_information.u.cfb.key, 16);
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "filter.epon_encryption.downstream_encryption_information.key is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_EPON_ENCRYPTION_INFORMATION_FORMAT_CTR:
                    cli_parm = bcmcli_find_named_parm(session, "filter.epon_encryption.downstream_encryption_information.key");
                    if (cli_parm != NULL)
                    {
                        if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 16)
                        {
                            apicli_print_complete(session, BCM_ERR_PARM, "buffer filter.epon_encryption.downstream_encryption_information.key must have 16 bytes\n");
                            return BCM_ERR_PARM;
                        }

                        bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
                        bcmolt_buf_read(&cli_parm->value.buffer, val.downstream_encryption_information.u.ctr.key, 16);
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "filter.epon_encryption.downstream_encryption_information.key is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "filter.epon_encryption.downstream_encryption_information.sci");
                    if (cli_parm != NULL)
                    {
                        if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 8)
                        {
                            apicli_print_complete(session, BCM_ERR_PARM, "buffer filter.epon_encryption.downstream_encryption_information.sci must have 8 bytes\n");
                            return BCM_ERR_PARM;
                        }

                        bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
                        bcmolt_buf_read(&cli_parm->value.buffer, val.downstream_encryption_information.u.ctr.sci, 8);
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "filter.epon_encryption.downstream_encryption_information.sci is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                default:
                    apicli_print_complete(session, BCM_ERR_RANGE, "\n");
                    return BCM_ERR_RANGE;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.epon_encryption.downstream_encryption_information is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.epon_encryption.upstream_mode");
        if (cli_parm != NULL)
        {
            val.upstream_mode = (bcmolt_epon_encryption_mode) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.epon_encryption.upstream_mode is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.epon_encryption.upstream_key_choice");
        if (cli_parm != NULL)
        {
            val.upstream_key_choice = (bcmolt_epon_key_choice) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.epon_encryption.upstream_key_choice is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "filter.epon_encryption.upstream_encryption_information.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "filter.epon_encryption.upstream_encryption_information.format");
            if (cli_parm != NULL)
            {
                val.upstream_encryption_information.format = (bcmolt_epon_encryption_information_format) cli_parm->value.enum_val;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.epon_encryption.upstream_encryption_information.format is not set\n");
                return BCM_ERR_PARM;
            }

            switch (val.upstream_encryption_information.format)
            {
                case BCMOLT_EPON_ENCRYPTION_INFORMATION_FORMAT_CFB:
                    cli_parm = bcmcli_find_named_parm(session, "filter.epon_encryption.upstream_encryption_information.key");
                    if (cli_parm != NULL)
                    {
                        if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 16)
                        {
                            apicli_print_complete(session, BCM_ERR_PARM, "buffer filter.epon_encryption.upstream_encryption_information.key must have 16 bytes\n");
                            return BCM_ERR_PARM;
                        }

                        bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
                        bcmolt_buf_read(&cli_parm->value.buffer, val.upstream_encryption_information.u.cfb.key, 16);
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "filter.epon_encryption.upstream_encryption_information.key is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_EPON_ENCRYPTION_INFORMATION_FORMAT_CTR:
                    cli_parm = bcmcli_find_named_parm(session, "filter.epon_encryption.upstream_encryption_information.key");
                    if (cli_parm != NULL)
                    {
                        if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 16)
                        {
                            apicli_print_complete(session, BCM_ERR_PARM, "buffer filter.epon_encryption.upstream_encryption_information.key must have 16 bytes\n");
                            return BCM_ERR_PARM;
                        }

                        bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
                        bcmolt_buf_read(&cli_parm->value.buffer, val.upstream_encryption_information.u.ctr.key, 16);
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "filter.epon_encryption.upstream_encryption_information.key is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "filter.epon_encryption.upstream_encryption_information.sci");
                    if (cli_parm != NULL)
                    {
                        if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 8)
                        {
                            apicli_print_complete(session, BCM_ERR_PARM, "buffer filter.epon_encryption.upstream_encryption_information.sci must have 8 bytes\n");
                            return BCM_ERR_PARM;
                        }

                        bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
                        bcmolt_buf_read(&cli_parm->value.buffer, val.upstream_encryption_information.u.ctr.sci, 8);
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "filter.epon_encryption.upstream_encryption_information.sci is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                default:
                    apicli_print_complete(session, BCM_ERR_RANGE, "\n");
                    return BCM_ERR_RANGE;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.epon_encryption.upstream_encryption_information is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_link, epon_encryption, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_epon_encryption_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_LINK_CFG_ID_EPON_ENCRYPTION, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_link, epon_encryption, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "epon_encryption");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_link, epon_encryption);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_link, epon_encryption);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.fec_enable.");
    if (cli_parm != NULL)
    {
        bcmolt_epon_link_fec_en val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.fec_enable.upstream");
        if (cli_parm != NULL)
        {
            val.upstream = (bcmolt_epon_link_fec_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.fec_enable.upstream is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.fec_enable.downstream");
        if (cli_parm != NULL)
        {
            val.downstream = (bcmolt_epon_link_fec_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.fec_enable.downstream is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_link, fec_enable, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_epon_link_fec_en val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_LINK_CFG_ID_FEC_ENABLE, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_link, fec_enable, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "fec_enable");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_link, fec_enable);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_link, fec_enable);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.oam_heartbeat_config.");
    if (cli_parm != NULL)
    {
        bcmolt_oam_heartbeat_config val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.oam_heartbeat_config.send_period");
        if (cli_parm != NULL)
        {
            val.send_period = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.oam_heartbeat_config.send_period is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.oam_heartbeat_config.transmit_frame");
        if (cli_parm != NULL)
        {
            val.transmit_frame.len = bcmolt_buf_get_used(&cli_parm->value.buffer);
            val.transmit_frame.val = apicli_byte_pool_calloc(byte_pool, val.transmit_frame.len);
            if (val.transmit_frame.val == NULL)
            {
                apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
                return BCM_ERR_NOMEM;
            }

            bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
            bcmolt_buf_read(&cli_parm->value.buffer, val.transmit_frame.val, val.transmit_frame.len);
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.oam_heartbeat_config.transmit_frame is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "filter.oam_heartbeat_config.ignored_receive_frame_template.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "filter.oam_heartbeat_config.ignored_receive_frame_template.frame_octets");
            if (cli_parm != NULL)
            {
                val.ignored_receive_frame_template.frame_octets.len = bcmolt_buf_get_used(&cli_parm->value.buffer);
                val.ignored_receive_frame_template.frame_octets.val = apicli_byte_pool_calloc(byte_pool, val.ignored_receive_frame_template.frame_octets.len);
                if (val.ignored_receive_frame_template.frame_octets.val == NULL)
                {
                    apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
                    return BCM_ERR_NOMEM;
                }

                bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
                bcmolt_buf_read(&cli_parm->value.buffer, val.ignored_receive_frame_template.frame_octets.val, val.ignored_receive_frame_template.frame_octets.len);
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.oam_heartbeat_config.ignored_receive_frame_template.frame_octets is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.oam_heartbeat_config.ignored_receive_frame_template.mask_octets");
            if (cli_parm != NULL)
            {
                val.ignored_receive_frame_template.mask_octets.len = bcmolt_buf_get_used(&cli_parm->value.buffer);
                val.ignored_receive_frame_template.mask_octets.val = apicli_byte_pool_calloc(byte_pool, val.ignored_receive_frame_template.mask_octets.len);
                if (val.ignored_receive_frame_template.mask_octets.val == NULL)
                {
                    apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
                    return BCM_ERR_NOMEM;
                }

                bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
                bcmolt_buf_read(&cli_parm->value.buffer, val.ignored_receive_frame_template.mask_octets.val, val.ignored_receive_frame_template.mask_octets.len);
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.oam_heartbeat_config.ignored_receive_frame_template.mask_octets is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.oam_heartbeat_config.ignored_receive_frame_template is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.oam_heartbeat_config.receive_timeout");
        if (cli_parm != NULL)
        {
            val.receive_timeout = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.oam_heartbeat_config.receive_timeout is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.oam_heartbeat_config.maximum_receive_size");
        if (cli_parm != NULL)
        {
            val.maximum_receive_size = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.oam_heartbeat_config.maximum_receive_size is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_link, oam_heartbeat_config, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_oam_heartbeat_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_LINK_CFG_ID_OAM_HEARTBEAT_CONFIG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_link, oam_heartbeat_config, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "oam_heartbeat_config");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_link, oam_heartbeat_config);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_link, oam_heartbeat_config);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.upstream_bandwidth.");
    if (cli_parm != NULL)
    {
        bcmolt_upstream_bandwidth_distribution val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.upstream_bandwidth.polling_interval_us");
        if (cli_parm != NULL)
        {
            val.polling_interval_us = (bcmolt_polling_interval) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.upstream_bandwidth.polling_interval_us is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.upstream_bandwidth.grant_threshold_tq");
        if (cli_parm != NULL)
        {
            val.grant_threshold_tq = (bcmolt_time_quanta) cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.upstream_bandwidth.grant_threshold_tq is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "filter.upstream_bandwidth.min_schedulershaper.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "filter.upstream_bandwidth.min_schedulershaper.bandwidth_Kbps");
            if (cli_parm != NULL)
            {
                val.min_schedulershaper.bandwidth_Kbps = (bcmolt_bandwidth_Kbps) cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.upstream_bandwidth.min_schedulershaper.bandwidth_Kbps is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.upstream_bandwidth.min_schedulershaper.max_burst_size_tq");
            if (cli_parm != NULL)
            {
                val.min_schedulershaper.max_burst_size_tq = (bcmolt_time_quanta) cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.upstream_bandwidth.min_schedulershaper.max_burst_size_tq is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.upstream_bandwidth.min_schedulershaper.priority");
            if (cli_parm != NULL)
            {
                val.min_schedulershaper.priority = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.upstream_bandwidth.min_schedulershaper.priority is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.upstream_bandwidth.min_schedulershaper.weight_tq");
            if (cli_parm != NULL)
            {
                val.min_schedulershaper.weight_tq = (bcmolt_time_quanta) cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.upstream_bandwidth.min_schedulershaper.weight_tq is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.upstream_bandwidth.min_schedulershaper is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "filter.upstream_bandwidth.max_schedulershaper.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "filter.upstream_bandwidth.max_schedulershaper.bandwidth_Kbps");
            if (cli_parm != NULL)
            {
                val.max_schedulershaper.bandwidth_Kbps = (bcmolt_bandwidth_Kbps) cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.upstream_bandwidth.max_schedulershaper.bandwidth_Kbps is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.upstream_bandwidth.max_schedulershaper.max_burst_size_tq");
            if (cli_parm != NULL)
            {
                val.max_schedulershaper.max_burst_size_tq = (bcmolt_time_quanta) cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.upstream_bandwidth.max_schedulershaper.max_burst_size_tq is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.upstream_bandwidth.max_schedulershaper.priority");
            if (cli_parm != NULL)
            {
                val.max_schedulershaper.priority = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.upstream_bandwidth.max_schedulershaper.priority is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.upstream_bandwidth.max_schedulershaper.weight_tq");
            if (cli_parm != NULL)
            {
                val.max_schedulershaper.weight_tq = (bcmolt_time_quanta) cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.upstream_bandwidth.max_schedulershaper.weight_tq is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.upstream_bandwidth.max_schedulershaper is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.upstream_bandwidth.tdm_grant_size_tq");
        if (cli_parm != NULL)
        {
            val.tdm_grant_size_tq = (bcmolt_time_quanta) cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.upstream_bandwidth.tdm_grant_size_tq is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.upstream_bandwidth.tdm_grant_interval_us");
        if (cli_parm != NULL)
        {
            val.tdm_grant_interval_us = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.upstream_bandwidth.tdm_grant_interval_us is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_link, upstream_bandwidth, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_upstream_bandwidth_distribution val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_LINK_CFG_ID_UPSTREAM_BANDWIDTH, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_link, upstream_bandwidth, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "upstream_bandwidth");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_link, upstream_bandwidth);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_link, upstream_bandwidth);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.ubd_info.");
    if (cli_parm != NULL)
    {
        bcmolt_ubd_info val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.ubd_info.actual_polling_interval");
        if (cli_parm != NULL)
        {
            val.actual_polling_interval = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ubd_info.actual_polling_interval is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.ubd_info.actual_grant_threshold_tq");
        if (cli_parm != NULL)
        {
            val.actual_grant_threshold_tq = (bcmolt_time_quanta) cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ubd_info.actual_grant_threshold_tq is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "filter.ubd_info.actual_min_schedulershaper.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "filter.ubd_info.actual_min_schedulershaper.actual_mbs_tq");
            if (cli_parm != NULL)
            {
                val.actual_min_schedulershaper.actual_mbs_tq = (bcmolt_time_quanta) cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.ubd_info.actual_min_schedulershaper.actual_mbs_tq is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.ubd_info.actual_min_schedulershaper.actual_weight_tq");
            if (cli_parm != NULL)
            {
                val.actual_min_schedulershaper.actual_weight_tq = (bcmolt_time_quanta) cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.ubd_info.actual_min_schedulershaper.actual_weight_tq is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ubd_info.actual_min_schedulershaper is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "filter.ubd_info.actual_max_schedulershaper.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "filter.ubd_info.actual_max_schedulershaper.actual_mbs_tq");
            if (cli_parm != NULL)
            {
                val.actual_max_schedulershaper.actual_mbs_tq = (bcmolt_time_quanta) cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.ubd_info.actual_max_schedulershaper.actual_mbs_tq is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.ubd_info.actual_max_schedulershaper.actual_weight_tq");
            if (cli_parm != NULL)
            {
                val.actual_max_schedulershaper.actual_weight_tq = (bcmolt_time_quanta) cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.ubd_info.actual_max_schedulershaper.actual_weight_tq is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ubd_info.actual_max_schedulershaper is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_link, ubd_info, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_ubd_info val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_LINK_CFG_ID_UBD_INFO, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_link, ubd_info, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "ubd_info");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_link, ubd_info);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_link, ubd_info);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.clock_transport_enable");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, epon_link, clock_transport_enable, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_link, clock_transport_enable, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_LINK_CFG_ID_CLOCK_TRANSPORT_ENABLE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "clock_transport_enable");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_link, clock_transport_enable);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_link, clock_transport_enable);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.pending_grants");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, epon_link, pending_grants, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_link, pending_grants, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_LINK_CFG_ID_PENDING_GRANTS, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "pending_grants");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_link, pending_grants);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_link, pending_grants);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.link_type");
    if (cli_parm != NULL)
    {
        bcmolt_epon_link_type val;
        val = (bcmolt_epon_link_type) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, epon_link, link_type, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_link, link_type, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_LINK_CFG_ID_LINK_TYPE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "link_type");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_link, link_type);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_link, link_type);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_link, link_rate) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_link, state_flags) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_link, llid) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_link, laser_on_time_tq) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_link, laser_off_time_tq) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_link, range_value_tq) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_link, distance) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_link, alarm_state) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_link, tunnel_id) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_link, onu_id) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_link, min_laser_overhead) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_link, key_exchange_config) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_link, epon_encryption) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_link, fec_enable) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_link, oam_heartbeat_config) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_link, upstream_bandwidth) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_link, ubd_info) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_link, clock_transport_enable) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_link, pending_grants) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_link, link_type))
    {
        BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_link, all_properties);
        bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_link, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);
    bcmcli_log("bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_link_stat_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_link_stat stat;     /**< declare main API struct */
    bcmolt_epon_link_key key = { }; /**< declare key */
    bcmos_bool clear_on_read;       /**< declare 'clear on read' flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_link_stat stat;\n");
    bcmcli_log("bcmolt_epon_link_key key = {  };\n");
    bcmcli_log("bcmos_bool clear_on_read;\n");
    apicli_print_start(session, "bcmolt_stat_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_LINK_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "mac_address");
    if (cli_parm != NULL)
    {
        key.mac_address = cli_parm->value.mac;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "mac_address is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.mac_address = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_LINK_KEY_ID_MAC_ADDRESS, &key.mac_address);
    bcmcli_log(";\n");

    /* set stat flags from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "clear");
    if (cli_parm != NULL)
    {
        clear_on_read = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "clear is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("clear_on_read = %s;\n", (clear_on_read) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* init the API struct */
    BCMOLT_STAT_INIT(&stat, epon_link, key);
    bcmcli_log("BCMOLT_STAT_INIT(&stat, epon_link, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "rx_data_bytes");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_data_bytes);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_data_bytes);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_data_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_data_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_data_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_frames_64");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_frames_64);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_frames_64);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_frames_65_127");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_frames_65_127);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_frames_65_127);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_frames_128_255");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_frames_128_255);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_frames_128_255);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_frames_256_511");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_frames_256_511);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_frames_256_511);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_frames_512_1023");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_frames_512_1023);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_frames_512_1023);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_frames_1024_1518");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_frames_1024_1518);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_frames_1024_1518);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_frames_1519_2047");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_frames_1519_2047);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_frames_1519_2047);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_frames_2048_4095");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_frames_2048_4095);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_frames_2048_4095);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_frames_4096_9216");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_frames_4096_9216);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_frames_4096_9216);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_frames_9217_16383");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_frames_9217_16383);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_frames_9217_16383);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_oam_bytes");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_oam_bytes);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_oam_bytes);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_oam_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_oam_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_oam_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_mpcp_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_mpcp_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_mpcp_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_broadcast_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_broadcast_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_broadcast_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_unicast_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_unicast_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_unicast_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_multicast_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_multicast_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_multicast_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_report_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_report_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_report_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_fcs_error");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_fcs_error);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_fcs_error);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_oversize_error");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_oversize_error);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_oversize_error);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_runt_error");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_runt_error);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_runt_error);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_line_code_error");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_line_code_error);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_line_code_error);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_line_code_error_max");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_line_code_error_max);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_link, rx_line_code_error_max);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_data_bytes");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_link, tx_data_bytes);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_link, tx_data_bytes);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_data_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_link, tx_data_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_link, tx_data_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_frames_64");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_link, tx_frames_64);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_link, tx_frames_64);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_frames_65_127");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_link, tx_frames_65_127);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_link, tx_frames_65_127);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_frames_128_255");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_link, tx_frames_128_255);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_link, tx_frames_128_255);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_frames_256_511");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_link, tx_frames_256_511);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_link, tx_frames_256_511);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_frames_512_1023");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_link, tx_frames_512_1023);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_link, tx_frames_512_1023);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_frames_1024_1518");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_link, tx_frames_1024_1518);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_link, tx_frames_1024_1518);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_frames_1519_2047");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_link, tx_frames_1519_2047);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_link, tx_frames_1519_2047);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_frames_2048_4095");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_link, tx_frames_2048_4095);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_link, tx_frames_2048_4095);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_frames_4096_9216");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_link, tx_frames_4096_9216);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_link, tx_frames_4096_9216);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_frames_9217_16383");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_link, tx_frames_9217_16383);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_link, tx_frames_9217_16383);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_oam_bytes");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_link, tx_oam_bytes);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_link, tx_oam_bytes);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_oam_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_link, tx_oam_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_link, tx_oam_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_mpcp_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_link, tx_mpcp_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_link, tx_mpcp_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_broadcast_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_link, tx_broadcast_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_link, tx_broadcast_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_unicast_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_link, tx_unicast_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_link, tx_unicast_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_multicast_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_link, tx_multicast_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_link, tx_multicast_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_gates");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_link, tx_gates);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_link, tx_gates);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_STAT_PROP_IS_SET(&stat, epon_link, rx_data_bytes) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_link, rx_data_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_link, rx_frames_64) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_link, rx_frames_65_127) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_link, rx_frames_128_255) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_link, rx_frames_256_511) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_link, rx_frames_512_1023) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_link, rx_frames_1024_1518) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_link, rx_frames_1519_2047) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_link, rx_frames_2048_4095) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_link, rx_frames_4096_9216) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_link, rx_frames_9217_16383) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_link, rx_oam_bytes) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_link, rx_oam_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_link, rx_mpcp_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_link, rx_broadcast_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_link, rx_unicast_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_link, rx_multicast_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_link, rx_report_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_link, rx_fcs_error) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_link, rx_oversize_error) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_link, rx_runt_error) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_link, rx_line_code_error) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_link, rx_line_code_error_max) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_link, tx_data_bytes) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_link, tx_data_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_link, tx_frames_64) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_link, tx_frames_65_127) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_link, tx_frames_128_255) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_link, tx_frames_256_511) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_link, tx_frames_512_1023) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_link, tx_frames_1024_1518) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_link, tx_frames_1519_2047) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_link, tx_frames_2048_4095) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_link, tx_frames_4096_9216) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_link, tx_frames_9217_16383) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_link, tx_oam_bytes) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_link, tx_oam_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_link, tx_mpcp_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_link, tx_broadcast_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_link, tx_unicast_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_link, tx_multicast_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_link, tx_gates))
    {
        BCMOLT_STAT_PROP_GET(&stat, epon_link, all_properties);
        bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_link, all_properties);\n");
    }

    /* call API */
    err = bcmolt_stat_get(device_id, &stat.hdr, clear_on_read);
    bcmcli_log("bcmolt_stat_get(device_id, &stat.hdr, clear_on_read);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &stat.hdr.hdr);
    }

    apicli_print_complete(session, err, stat.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_link_oper_force_rediscovery_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_link_force_rediscovery oper;    /**< declare main API struct */
    bcmolt_epon_link_key key = { };             /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_link_force_rediscovery oper;\n");
    bcmcli_log("bcmolt_epon_link_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_LINK_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "mac_address");
    if (cli_parm != NULL)
    {
        key.mac_address = cli_parm->value.mac;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "mac_address is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.mac_address = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_LINK_KEY_ID_MAC_ADDRESS, &key.mac_address);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, epon_link, force_rediscovery, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, epon_link, force_rediscovery, key);\n");

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_link_oper_delete_link_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_link_delete_link oper;  /**< declare main API struct */
    bcmolt_epon_link_key key = { };     /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_link_delete_link oper;\n");
    bcmcli_log("bcmolt_epon_link_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_LINK_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "mac_address");
    if (cli_parm != NULL)
    {
        key.mac_address = cli_parm->value.mac;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "mac_address is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.mac_address = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_LINK_KEY_ID_MAC_ADDRESS, &key.mac_address);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, epon_link, delete_link, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, epon_link, delete_link, key);\n");

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_link_oper_oam_keepalive_timer_start_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_link_oam_keepalive_timer_start oper;    /**< declare main API struct */
    bcmolt_epon_link_key key = { };                     /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_link_oam_keepalive_timer_start oper;\n");
    bcmcli_log("bcmolt_epon_link_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_LINK_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "mac_address");
    if (cli_parm != NULL)
    {
        key.mac_address = cli_parm->value.mac;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "mac_address is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.mac_address = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_LINK_KEY_ID_MAC_ADDRESS, &key.mac_address);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, epon_link, oam_keepalive_timer_start, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, epon_link, oam_keepalive_timer_start, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "send_period");
    if (cli_parm != NULL)
    {
        uint16_t val;
        val = cli_parm->value.unumber;
        BCMOLT_OPER_PROP_SET(&oper, epon_link, oam_keepalive_timer_start, send_period, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, epon_link, oam_keepalive_timer_start, send_period, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_OPER, BCMOLT_EPON_LINK_OPER_ID_OAM_KEEPALIVE_TIMER_START, BCMOLT_EPON_LINK_OAM_KEEPALIVE_TIMER_START_ID_SEND_PERIOD, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_link_oper_oam_keepalive_timer_stop_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_link_oam_keepalive_timer_stop oper; /**< declare main API struct */
    bcmolt_epon_link_key key = { };                 /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_link_oam_keepalive_timer_stop oper;\n");
    bcmcli_log("bcmolt_epon_link_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_LINK_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "mac_address");
    if (cli_parm != NULL)
    {
        key.mac_address = cli_parm->value.mac;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "mac_address is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.mac_address = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_LINK_KEY_ID_MAC_ADDRESS, &key.mac_address);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, epon_link, oam_keepalive_timer_stop, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, epon_link, oam_keepalive_timer_stop, key);\n");

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_link_oper_key_exchange_start_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_link_key_exchange_start oper;   /**< declare main API struct */
    bcmolt_epon_link_key key = { };             /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_link_key_exchange_start oper;\n");
    bcmcli_log("bcmolt_epon_link_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_LINK_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "mac_address");
    if (cli_parm != NULL)
    {
        key.mac_address = cli_parm->value.mac;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "mac_address is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.mac_address = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_LINK_KEY_ID_MAC_ADDRESS, &key.mac_address);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, epon_link, key_exchange_start, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, epon_link, key_exchange_start, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "period");
    if (cli_parm != NULL)
    {
        uint16_t val;
        val = cli_parm->value.unumber;
        BCMOLT_OPER_PROP_SET(&oper, epon_link, key_exchange_start, period, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, epon_link, key_exchange_start, period, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_OPER, BCMOLT_EPON_LINK_OPER_ID_KEY_EXCHANGE_START, BCMOLT_EPON_LINK_KEY_EXCHANGE_START_ID_PERIOD, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_link_oper_key_exchange_stop_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_link_key_exchange_stop oper;    /**< declare main API struct */
    bcmolt_epon_link_key key = { };             /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_link_key_exchange_stop oper;\n");
    bcmcli_log("bcmolt_epon_link_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_LINK_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "mac_address");
    if (cli_parm != NULL)
    {
        key.mac_address = cli_parm->value.mac;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "mac_address is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.mac_address = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_LINK_KEY_ID_MAC_ADDRESS, &key.mac_address);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, epon_link, key_exchange_stop, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, epon_link, key_exchange_stop, key);\n");

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_link_oper_static_registration_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_link_static_registration oper;  /**< declare main API struct */
    bcmolt_epon_link_key key = { };             /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_link_static_registration oper;\n");
    bcmcli_log("bcmolt_epon_link_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_LINK_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "mac_address");
    if (cli_parm != NULL)
    {
        key.mac_address = cli_parm->value.mac;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "mac_address is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.mac_address = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_LINK_KEY_ID_MAC_ADDRESS, &key.mac_address);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, epon_link, static_registration, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, epon_link, static_registration, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "laseron_time_tq");
    if (cli_parm != NULL)
    {
        bcmolt_time_quanta val;
        val = (bcmolt_time_quanta) cli_parm->value.unumber;
        BCMOLT_OPER_PROP_SET(&oper, epon_link, static_registration, laseron_time_tq, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, epon_link, static_registration, laseron_time_tq, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_OPER, BCMOLT_EPON_LINK_OPER_ID_STATIC_REGISTRATION, BCMOLT_EPON_LINK_STATIC_REGISTRATION_ID_LASERON_TIME_TQ, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "laseroff_time_tq");
    if (cli_parm != NULL)
    {
        bcmolt_time_quanta val;
        val = (bcmolt_time_quanta) cli_parm->value.unumber;
        BCMOLT_OPER_PROP_SET(&oper, epon_link, static_registration, laseroff_time_tq, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, epon_link, static_registration, laseroff_time_tq, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_OPER, BCMOLT_EPON_LINK_OPER_ID_STATIC_REGISTRATION, BCMOLT_EPON_LINK_STATIC_REGISTRATION_ID_LASEROFF_TIME_TQ, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "range_value_tq");
    if (cli_parm != NULL)
    {
        bcmolt_time_quanta val;
        val = (bcmolt_time_quanta) cli_parm->value.unumber;
        BCMOLT_OPER_PROP_SET(&oper, epon_link, static_registration, range_value_tq, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, epon_link, static_registration, range_value_tq, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_OPER, BCMOLT_EPON_LINK_OPER_ID_STATIC_REGISTRATION, BCMOLT_EPON_LINK_STATIC_REGISTRATION_ID_RANGE_VALUE_TQ, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "pending_grants");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_OPER_PROP_SET(&oper, epon_link, static_registration, pending_grants, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, epon_link, static_registration, pending_grants, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_OPER, BCMOLT_EPON_LINK_OPER_ID_STATIC_REGISTRATION, BCMOLT_EPON_LINK_STATIC_REGISTRATION_ID_PENDING_GRANTS, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_link_proxy_inject_frame_send(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_link_inject_frame proxy;    /**< declare main API struct */
    bcmolt_epon_link_key key = { };         /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_link_inject_frame proxy;\n");
    bcmcli_log("bcmolt_epon_link_key key = {  };\n");
    apicli_print_start(session, "bcmolt_proxy_send");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_LINK_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "mac_address");
    if (cli_parm != NULL)
    {
        key.mac_address = cli_parm->value.mac;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "mac_address is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.mac_address = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_LINK_KEY_ID_MAC_ADDRESS, &key.mac_address);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_PROXY_INIT(&proxy, epon_link, inject_frame, key);
    bcmcli_log("BCMOLT_PROXY_INIT(&proxy, epon_link, inject_frame, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_parm_by_prefix(session, "frame.");
    if (cli_parm != NULL)
    {
        bcmolt_ethernet_frame_unmasked val = { };
        cli_parm = bcmcli_find_named_parm(session, "frame.frame_octets");
        if (cli_parm != NULL)
        {
            val.frame_octets.len = bcmolt_buf_get_used(&cli_parm->value.buffer);
            val.frame_octets.val = apicli_byte_pool_calloc(byte_pool, val.frame_octets.len);
            if (val.frame_octets.val == NULL)
            {
                apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
                return BCM_ERR_NOMEM;
            }

            bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
            bcmolt_buf_read(&cli_parm->value.buffer, val.frame_octets.val, val.frame_octets.len);
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "frame.frame_octets is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_PROXY_PROP_SET(&proxy, epon_link, inject_frame, frame, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_ethernet_frame_unmasked val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_PROXY, BCMOLT_EPON_LINK_PROXY_ID_INJECT_FRAME, BCMOLT_EPON_LINK_INJECT_FRAME_ID_FRAME, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_PROXY_PROP_SET(&proxy, epon_link, inject_frame, frame, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_proxy_send(device_id, &proxy.hdr);
    bcmcli_log("bcmolt_proxy_send(device_id, &proxy.hdr);\n");
    apicli_print_complete(session, err, proxy.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_link_stat_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_link_stat_cfg stat_cfg; /**< declare main API struct */
    bcmolt_epon_link_key key = { };     /**< declare key */
    bcmolt_epon_link_stat_id stat_id;   /**< declare stat ID */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_link_stat_cfg stat_cfg;\n");
    bcmcli_log("bcmolt_epon_link_key key = {  };\n");
    apicli_print_start(session, "bcmolt_stat_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_LINK_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "mac_address");
    if (cli_parm != NULL)
    {
        key.mac_address = cli_parm->value.mac;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "mac_address is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.mac_address = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_LINK_KEY_ID_MAC_ADDRESS, &key.mac_address);
    bcmcli_log(";\n");

    /* set stat ID from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "sub");
    if (cli_parm != NULL)
    {
        stat_id = (bcmolt_epon_link_stat_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
        return BCM_ERR_PARM;
    }

    /* init the API struct */
    switch (stat_id)
    {
        case BCMOLT_EPON_LINK_STAT_ID_RX_DATA_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_data_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_data_bytes, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_RX_DATA_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_data_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_data_frames, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_64:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_frames_64, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_frames_64, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_65_127:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_frames_65_127, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_frames_65_127, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_128_255:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_frames_128_255, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_frames_128_255, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_256_511:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_frames_256_511, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_frames_256_511, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_512_1023:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_frames_512_1023, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_frames_512_1023, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_1024_1518:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_frames_1024_1518, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_frames_1024_1518, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_1519_2047:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_frames_1519_2047, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_frames_1519_2047, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_2048_4095:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_frames_2048_4095, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_frames_2048_4095, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_4096_9216:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_frames_4096_9216, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_frames_4096_9216, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_9217_16383:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_frames_9217_16383, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_frames_9217_16383, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_RX_OAM_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_oam_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_oam_bytes, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_RX_OAM_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_oam_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_oam_frames, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_RX_MPCP_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_mpcp_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_mpcp_frames, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_RX_BROADCAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_broadcast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_broadcast_frames, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_RX_UNICAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_unicast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_unicast_frames, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_RX_MULTICAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_multicast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_multicast_frames, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_RX_REPORT_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_report_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_report_frames, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_RX_FCS_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_fcs_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_fcs_error, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_RX_OVERSIZE_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_oversize_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_oversize_error, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_RX_RUNT_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_runt_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_runt_error, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_RX_LINE_CODE_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_line_code_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_line_code_error, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_RX_LINE_CODE_ERROR_MAX:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_line_code_error_max, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_line_code_error_max, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_TX_DATA_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_data_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_data_bytes, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_TX_DATA_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_data_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_data_frames, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_64:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_frames_64, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_frames_64, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_65_127:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_frames_65_127, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_frames_65_127, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_128_255:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_frames_128_255, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_frames_128_255, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_256_511:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_frames_256_511, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_frames_256_511, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_512_1023:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_frames_512_1023, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_frames_512_1023, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_1024_1518:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_frames_1024_1518, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_frames_1024_1518, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_1519_2047:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_frames_1519_2047, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_frames_1519_2047, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_2048_4095:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_frames_2048_4095, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_frames_2048_4095, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_4096_9216:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_frames_4096_9216, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_frames_4096_9216, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_9217_16383:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_frames_9217_16383, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_frames_9217_16383, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_TX_OAM_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_oam_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_oam_bytes, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_TX_OAM_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_oam_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_oam_frames, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_TX_MPCP_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_mpcp_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_mpcp_frames, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_TX_BROADCAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_broadcast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_broadcast_frames, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_TX_UNICAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_unicast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_unicast_frames, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_TX_MULTICAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_multicast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_multicast_frames, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_TX_GATES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_gates, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_gates, key);\n");
            break;
        default:
            apicli_print_complete(session, BCM_ERR_RANGE, "\n");
            return BCM_ERR_RANGE;
    }

    /* call API */
    err = bcmolt_stat_cfg_get(device_id, &stat_cfg.hdr);
    bcmcli_log("bcmolt_stat_cfg_get(device_id, &stat_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &stat_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, stat_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_link_stat_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_link_stat_cfg stat_cfg; /**< declare main API struct */
    bcmolt_epon_link_key key = { };     /**< declare key */
    bcmolt_epon_link_stat_id stat_id;   /**< declare stat ID */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_link_stat_cfg stat_cfg;\n");
    bcmcli_log("bcmolt_epon_link_key key = {  };\n");
    apicli_print_start(session, "bcmolt_stat_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_LINK_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "mac_address");
    if (cli_parm != NULL)
    {
        key.mac_address = cli_parm->value.mac;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "mac_address is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.mac_address = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_LINK_KEY_ID_MAC_ADDRESS, &key.mac_address);
    bcmcli_log(";\n");

    /* set stat ID from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "sub");
    if (cli_parm != NULL)
    {
        stat_id = (bcmolt_epon_link_stat_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
        return BCM_ERR_PARM;
    }

    /* init the API struct */
    switch (stat_id)
    {
        case BCMOLT_EPON_LINK_STAT_ID_RX_DATA_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_data_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_data_bytes, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_RX_DATA_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_data_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_data_frames, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_64:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_frames_64, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_frames_64, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_65_127:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_frames_65_127, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_frames_65_127, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_128_255:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_frames_128_255, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_frames_128_255, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_256_511:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_frames_256_511, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_frames_256_511, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_512_1023:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_frames_512_1023, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_frames_512_1023, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_1024_1518:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_frames_1024_1518, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_frames_1024_1518, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_1519_2047:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_frames_1519_2047, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_frames_1519_2047, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_2048_4095:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_frames_2048_4095, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_frames_2048_4095, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_4096_9216:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_frames_4096_9216, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_frames_4096_9216, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_9217_16383:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_frames_9217_16383, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_frames_9217_16383, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_RX_OAM_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_oam_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_oam_bytes, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_RX_OAM_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_oam_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_oam_frames, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_RX_MPCP_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_mpcp_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_mpcp_frames, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_RX_BROADCAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_broadcast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_broadcast_frames, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_RX_UNICAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_unicast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_unicast_frames, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_RX_MULTICAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_multicast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_multicast_frames, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_RX_REPORT_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_report_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_report_frames, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_RX_FCS_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_fcs_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_fcs_error, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_RX_OVERSIZE_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_oversize_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_oversize_error, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_RX_RUNT_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_runt_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_runt_error, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_RX_LINE_CODE_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_line_code_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_line_code_error, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_RX_LINE_CODE_ERROR_MAX:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_line_code_error_max, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, rx_line_code_error_max, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_TX_DATA_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_data_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_data_bytes, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_TX_DATA_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_data_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_data_frames, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_64:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_frames_64, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_frames_64, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_65_127:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_frames_65_127, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_frames_65_127, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_128_255:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_frames_128_255, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_frames_128_255, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_256_511:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_frames_256_511, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_frames_256_511, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_512_1023:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_frames_512_1023, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_frames_512_1023, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_1024_1518:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_frames_1024_1518, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_frames_1024_1518, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_1519_2047:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_frames_1519_2047, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_frames_1519_2047, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_2048_4095:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_frames_2048_4095, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_frames_2048_4095, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_4096_9216:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_frames_4096_9216, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_frames_4096_9216, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_9217_16383:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_frames_9217_16383, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_frames_9217_16383, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_TX_OAM_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_oam_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_oam_bytes, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_TX_OAM_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_oam_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_oam_frames, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_TX_MPCP_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_mpcp_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_mpcp_frames, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_TX_BROADCAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_broadcast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_broadcast_frames, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_TX_UNICAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_unicast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_unicast_frames, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_TX_MULTICAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_multicast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_multicast_frames, key);\n");
            break;
        case BCMOLT_EPON_LINK_STAT_ID_TX_GATES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_gates, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_link, tx_gates, key);\n");
            break;
        default:
            apicli_print_complete(session, BCM_ERR_RANGE, "\n");
            return BCM_ERR_RANGE;
    }

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.");
    if (cli_parm != NULL)
    {
        bcmolt_stat_alarm_config val = { };
        cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.trigger.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.type");
            if (cli_parm != NULL)
            {
                val.trigger.type = (bcmolt_stat_condition_type) cli_parm->value.enum_val;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.type is not set\n");
                return BCM_ERR_PARM;
            }

            switch (val.trigger.type)
            {
                case BCMOLT_STAT_CONDITION_TYPE_RATE_THRESHOLD:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.rising");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_threshold.rising = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.rising is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.falling");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_threshold.falling = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.falling is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_RATE_RANGE:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.upper");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_range.upper = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.upper is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.lower");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_range.lower = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.lower is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_VALUE_THRESHOLD:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.limit");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.value_threshold.limit = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.limit is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_NONE:
                    break;
                default:
                    apicli_print_complete(session, BCM_ERR_RANGE, "\n");
                    return BCM_ERR_RANGE;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.soak.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "cfg.soak.active_soak_time");
            if (cli_parm != NULL)
            {
                val.soak.active_soak_time = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak.active_soak_time is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "cfg.soak.clear_soak_time");
            if (cli_parm != NULL)
            {
                val.soak.clear_soak_time = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak.clear_soak_time is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_STAT_CFG_PROP_SET(&stat_cfg, epon_link, cfg, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_stat_alarm_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_STAT_CFG, 0, BCMOLT_EPON_LINK_STAT_CFG_ID_CFG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_STAT_CFG_PROP_SET(&stat_cfg, epon_link, cfg, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_stat_cfg_set(device_id, &stat_cfg.hdr);
    bcmcli_log("bcmolt_stat_cfg_set(device_id, &stat_cfg.hdr);\n");
    apicli_print_complete(session, err, stat_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_link_auto_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_link_auto_cfg auto_cfg; /**< declare main API struct */
    bcmolt_epon_link_key key = { };     /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_link_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_epon_link_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_get");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, epon_link, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, epon_link, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "duplicate_mpcp_registration_request");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_link, duplicate_mpcp_registration_request);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_link, duplicate_mpcp_registration_request);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "encryption_enabled");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_link, encryption_enabled);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_link, encryption_enabled);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "key_exchange_failure");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_link, key_exchange_failure);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_link, key_exchange_failure);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "key_exchange_started");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_link, key_exchange_started);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_link, key_exchange_started);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "key_exchange_stopped");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_link, key_exchange_stopped);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_link, key_exchange_stopped);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "link_deleted");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_link, link_deleted);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_link, link_deleted);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "link_speed_mismatch");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_link, link_speed_mismatch);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_link, link_speed_mismatch);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "mpcp_deregistered");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_link, mpcp_deregistered);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_link, mpcp_deregistered);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "mpcp_discovered");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_link, mpcp_discovered);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_link, mpcp_discovered);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "mpcp_reg_ack_timeout");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_link, mpcp_reg_ack_timeout);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_link, mpcp_reg_ack_timeout);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "mpcp_report_timeout");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_link, mpcp_report_timeout);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_link, mpcp_report_timeout);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "oam_keepalive_timeout");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_link, oam_keepalive_timeout);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_link, oam_keepalive_timeout);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "oam_keepalive_timer_started");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_link, oam_keepalive_timer_started);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_link, oam_keepalive_timer_started);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "oam_keepalive_timer_stopped");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_link, oam_keepalive_timer_stopped);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_link, oam_keepalive_timer_stopped);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "preprovisioned_link_created");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_link, preprovisioned_link_created);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_link, preprovisioned_link_created);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "protection_switch_occurred");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_link, protection_switch_occurred);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_link, protection_switch_occurred);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "range_value_changed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_link, range_value_changed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_link, range_value_changed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rerange_failure");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_link, rerange_failure);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_link, rerange_failure);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_cleared");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_link, stat_alarm_cleared);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_link, stat_alarm_cleared);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_raised");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_link, stat_alarm_raised);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_link, stat_alarm_raised);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "static_registration_done");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_link, static_registration_done);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_link, static_registration_done);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_link, duplicate_mpcp_registration_request) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_link, encryption_enabled) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_link, key_exchange_failure) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_link, key_exchange_started) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_link, key_exchange_stopped) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_link, link_deleted) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_link, link_speed_mismatch) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_link, mpcp_deregistered) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_link, mpcp_discovered) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_link, mpcp_reg_ack_timeout) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_link, mpcp_report_timeout) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_link, oam_keepalive_timeout) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_link, oam_keepalive_timer_started) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_link, oam_keepalive_timer_stopped) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_link, preprovisioned_link_created) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_link, protection_switch_occurred) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_link, range_value_changed) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_link, rerange_failure) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_link, stat_alarm_cleared) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_link, stat_alarm_raised) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_link, static_registration_done))
    {
        BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_link, all_properties);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_link, all_properties);\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &auto_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_link_auto_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_link_auto_cfg auto_cfg; /**< declare main API struct */
    bcmolt_epon_link_key key = { };     /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_link_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_epon_link_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_set");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, epon_link, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, epon_link, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "duplicate_mpcp_registration_request");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_link, duplicate_mpcp_registration_request, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_link, duplicate_mpcp_registration_request, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_LINK_AUTO_CFG_ID_DUPLICATE_MPCP_REGISTRATION_REQUEST, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "encryption_enabled");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_link, encryption_enabled, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_link, encryption_enabled, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_LINK_AUTO_CFG_ID_ENCRYPTION_ENABLED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "key_exchange_failure");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_link, key_exchange_failure, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_link, key_exchange_failure, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_LINK_AUTO_CFG_ID_KEY_EXCHANGE_FAILURE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "key_exchange_started");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_link, key_exchange_started, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_link, key_exchange_started, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_LINK_AUTO_CFG_ID_KEY_EXCHANGE_STARTED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "key_exchange_stopped");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_link, key_exchange_stopped, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_link, key_exchange_stopped, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_LINK_AUTO_CFG_ID_KEY_EXCHANGE_STOPPED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "link_deleted");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_link, link_deleted, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_link, link_deleted, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_LINK_AUTO_CFG_ID_LINK_DELETED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "link_speed_mismatch");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_link, link_speed_mismatch, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_link, link_speed_mismatch, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_LINK_AUTO_CFG_ID_LINK_SPEED_MISMATCH, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "mpcp_deregistered");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_link, mpcp_deregistered, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_link, mpcp_deregistered, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_LINK_AUTO_CFG_ID_MPCP_DEREGISTERED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "mpcp_discovered");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_link, mpcp_discovered, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_link, mpcp_discovered, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_LINK_AUTO_CFG_ID_MPCP_DISCOVERED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "mpcp_reg_ack_timeout");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_link, mpcp_reg_ack_timeout, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_link, mpcp_reg_ack_timeout, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_LINK_AUTO_CFG_ID_MPCP_REG_ACK_TIMEOUT, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "mpcp_report_timeout");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_link, mpcp_report_timeout, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_link, mpcp_report_timeout, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_LINK_AUTO_CFG_ID_MPCP_REPORT_TIMEOUT, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "oam_keepalive_timeout");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_link, oam_keepalive_timeout, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_link, oam_keepalive_timeout, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_LINK_AUTO_CFG_ID_OAM_KEEPALIVE_TIMEOUT, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "oam_keepalive_timer_started");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_link, oam_keepalive_timer_started, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_link, oam_keepalive_timer_started, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_LINK_AUTO_CFG_ID_OAM_KEEPALIVE_TIMER_STARTED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "oam_keepalive_timer_stopped");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_link, oam_keepalive_timer_stopped, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_link, oam_keepalive_timer_stopped, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_LINK_AUTO_CFG_ID_OAM_KEEPALIVE_TIMER_STOPPED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "preprovisioned_link_created");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_link, preprovisioned_link_created, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_link, preprovisioned_link_created, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_LINK_AUTO_CFG_ID_PREPROVISIONED_LINK_CREATED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "protection_switch_occurred");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_link, protection_switch_occurred, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_link, protection_switch_occurred, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_LINK_AUTO_CFG_ID_PROTECTION_SWITCH_OCCURRED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "range_value_changed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_link, range_value_changed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_link, range_value_changed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_LINK_AUTO_CFG_ID_RANGE_VALUE_CHANGED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rerange_failure");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_link, rerange_failure, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_link, rerange_failure, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_LINK_AUTO_CFG_ID_RERANGE_FAILURE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_cleared");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_link, stat_alarm_cleared, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_link, stat_alarm_cleared, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_LINK_AUTO_CFG_ID_STAT_ALARM_CLEARED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_raised");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_link, stat_alarm_raised, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_link, stat_alarm_raised, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_LINK_AUTO_CFG_ID_STAT_ALARM_RAISED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "static_registration_done");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_link, static_registration_done, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_link, static_registration_done, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_LINK_AUTO_CFG_ID_STATIC_REGISTRATION_DONE, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);\n");
    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_ni_cfg_get(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_ni_cfg cfg;         /**< declare main API struct */
    bcmolt_epon_ni_key key = { };   /**< declare key */
    uint8_t *list_mem;              /**< declare memory buffer for variable-sized lists */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_ni_cfg cfg;\n");
    bcmcli_log("bcmolt_epon_ni_key key = {  };\n");
    bcmcli_log("uint8_t* list_mem;\n");
    apicli_print_start(session, "bcmolt_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_NI_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, epon_ni, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, epon_ni, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "mac_address");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_ni, mac_address);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_ni, mac_address);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "epon_ni_en");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_ni, epon_ni_en);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_ni, epon_ni_en);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "registration_behavior");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_ni, registration_behavior);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_ni, registration_behavior);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "mtu_1g");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_ni, mtu_1g);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_ni, mtu_1g);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "mtu_10g");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_ni, mtu_10g);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_ni, mtu_10g);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "minimum_fiber_length");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_ni, minimum_fiber_length);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_ni, minimum_fiber_length);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "maximum_fiber_length");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_ni, maximum_fiber_length);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_ni, maximum_fiber_length);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "grant_spacing_tq");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_ni, grant_spacing_tq);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_ni, grant_spacing_tq);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "epon_logical_link_options");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_ni, epon_logical_link_options);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_ni, epon_logical_link_options);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "mpcp_discovery_period_ms");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_ni, mpcp_discovery_period_ms);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_ni, mpcp_discovery_period_ms);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "alarm_state");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_ni, alarm_state);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_ni, alarm_state);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "all_links");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_ni, all_links);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_ni, all_links);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "encryption_cfg");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_ni, encryption_cfg);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_ni, encryption_cfg);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "protection_switching_cfg");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_ni, protection_switching_cfg);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_ni, protection_switching_cfg);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "clock_transport_cfg");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_ni, clock_transport_cfg);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_ni, clock_transport_cfg);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "dropdown_weights");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_ni, dropdown_weights);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_ni, dropdown_weights);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "approximate_solicited_usage");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_ni, approximate_solicited_usage);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_ni, approximate_solicited_usage);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "approximate_tdm_usage");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_ni, approximate_tdm_usage);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_ni, approximate_tdm_usage);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "no_reports_soak_time");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_ni, no_reports_soak_time);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_ni, no_reports_soak_time);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "pon_aggregate_shaper");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_ni, pon_aggregate_shaper);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_ni, pon_aggregate_shaper);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "estimated_pon_latency_tq");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_ni, estimated_pon_latency_tq);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_ni, estimated_pon_latency_tq);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_upgrade_params");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_ni, onu_upgrade_params);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_ni, onu_upgrade_params);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "auto_rogue_detect_10g_en");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_ni, auto_rogue_detect_10g_en);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_ni, auto_rogue_detect_10g_en);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "auto_rogue_detect_1g_en");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_ni, auto_rogue_detect_1g_en);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_ni, auto_rogue_detect_1g_en);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "auto_rogue_detect_10g_threshold");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_ni, auto_rogue_detect_10g_threshold);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_ni, auto_rogue_detect_10g_threshold);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_CFG_PROP_IS_SET(&cfg, epon_ni, mac_address) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_ni, epon_ni_en) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_ni, registration_behavior) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_ni, mtu_1g) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_ni, mtu_10g) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_ni, minimum_fiber_length) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_ni, maximum_fiber_length) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_ni, grant_spacing_tq) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_ni, epon_logical_link_options) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_ni, mpcp_discovery_period_ms) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_ni, alarm_state) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_ni, all_links) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_ni, encryption_cfg) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_ni, protection_switching_cfg) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_ni, clock_transport_cfg) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_ni, dropdown_weights) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_ni, approximate_solicited_usage) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_ni, approximate_tdm_usage) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_ni, no_reports_soak_time) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_ni, pon_aggregate_shaper) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_ni, estimated_pon_latency_tq) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_ni, onu_upgrade_params) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_ni, auto_rogue_detect_10g_en) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_ni, auto_rogue_detect_1g_en) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_ni, auto_rogue_detect_10g_threshold))
    {
        BCMOLT_CFG_PROP_GET(&cfg, epon_ni, all_properties);
        bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_ni, all_properties);\n");
    }

    /* set memory to use for variable-sized lists */
    list_mem = apicli_byte_pool_calloc(byte_pool, APICLI_DYNAMIC_LIST_BUFFER_SIZE);
    if (list_mem == NULL)
    {
        apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
        return BCM_ERR_NOMEM;
    }

    bcmcli_log("list_mem = bcmos_calloc(APICLI_DYNAMIC_LIST_BUFFER_SIZE);\n");
    BCMOLT_CFG_LIST_BUF_SET(&cfg, epon_ni, list_mem, APICLI_DYNAMIC_LIST_BUFFER_SIZE);
    bcmcli_log("BCMOLT_CFG_LIST_BUF_SET(&cfg, epon_ni, list_mem, APICLI_DYNAMIC_LIST_BUFFER_SIZE);\n");

    /* call API */
    err = bcmolt_cfg_get(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_get(device_id, &cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_ni_cfg_set(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_ni_cfg cfg;         /**< declare main API struct */
    bcmolt_epon_ni_key key = { };   /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_ni_cfg cfg;\n");
    bcmcli_log("bcmolt_epon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_NI_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, epon_ni, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, epon_ni, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "mac_address");
    if (cli_parm != NULL)
    {
        bcmos_mac_address val;
        val = cli_parm->value.mac;
        BCMOLT_CFG_PROP_SET(&cfg, epon_ni, mac_address, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_ni, mac_address, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_NI_CFG_ID_MAC_ADDRESS, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "registration_behavior");
    if (cli_parm != NULL)
    {
        bcmolt_registration_behavior val;
        val = (bcmolt_registration_behavior) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, epon_ni, registration_behavior, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_ni, registration_behavior, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_NI_CFG_ID_REGISTRATION_BEHAVIOR, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "mtu_1g");
    if (cli_parm != NULL)
    {
        uint16_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, epon_ni, mtu_1g, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_ni, mtu_1g, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_NI_CFG_ID_MTU_1G, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "mtu_10g");
    if (cli_parm != NULL)
    {
        uint16_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, epon_ni, mtu_10g, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_ni, mtu_10g, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_NI_CFG_ID_MTU_10G, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "minimum_fiber_length");
    if (cli_parm != NULL)
    {
        bcmolt_meters val;
        val = (bcmolt_meters) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, epon_ni, minimum_fiber_length, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_ni, minimum_fiber_length, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_NI_CFG_ID_MINIMUM_FIBER_LENGTH, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "maximum_fiber_length");
    if (cli_parm != NULL)
    {
        bcmolt_meters val;
        val = (bcmolt_meters) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, epon_ni, maximum_fiber_length, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_ni, maximum_fiber_length, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_NI_CFG_ID_MAXIMUM_FIBER_LENGTH, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "grant_spacing_tq");
    if (cli_parm != NULL)
    {
        bcmolt_time_quanta val;
        val = (bcmolt_time_quanta) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, epon_ni, grant_spacing_tq, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_ni, grant_spacing_tq, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_NI_CFG_ID_GRANT_SPACING_TQ, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "epon_logical_link_options.");
    if (cli_parm != NULL)
    {
        bcmolt_epon_logical_link_options val = { };
        cli_parm = bcmcli_find_parm_by_prefix(session, "epon_logical_link_options.registration_gate_mode.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "epon_logical_link_options.registration_gate_mode.registration_gate_mode");
            if (cli_parm != NULL)
            {
                val.registration_gate_mode.registration_gate_mode = (bcmolt_mpcp_gate_mode) cli_parm->value.enum_val;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "epon_logical_link_options.registration_gate_mode.registration_gate_mode is not set\n");
                return BCM_ERR_PARM;
            }

            switch (val.registration_gate_mode.registration_gate_mode)
            {
                case BCMOLT_MPCP_GATE_MODE_TEKNOVUS:
                    cli_parm = bcmcli_find_named_parm(session, "epon_logical_link_options.registration_gate_mode.reg_ack_timeout_ms");
                    if (cli_parm != NULL)
                    {
                        val.registration_gate_mode.u.teknovus.reg_ack_timeout_ms = cli_parm->value.unumber;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "epon_logical_link_options.registration_gate_mode.reg_ack_timeout_ms is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_MPCP_GATE_MODE_CUSTOM:
                    cli_parm = bcmcli_find_parm_by_prefix(session, "epon_logical_link_options.registration_gate_mode.gates.");
                    if (cli_parm != NULL)
                    {
                        int32_t i0;
                        val.registration_gate_mode.u.custom.gates.val = apicli_byte_pool_calloc(byte_pool, cli_parm->array_size * sizeof(*val.registration_gate_mode.u.custom.gates.val));
                        if (val.registration_gate_mode.u.custom.gates.val == NULL)
                        {
                            apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
                            return BCM_ERR_NOMEM;
                        }

                        val.registration_gate_mode.u.custom.gates.len = cli_parm->array_size;
                        cli_parm = bcmcli_find_named_parm(session, "epon_logical_link_options.registration_gate_mode.gates.flags");
                        if (cli_parm != NULL)
                        {
                            if (cli_parm->array_size != val.registration_gate_mode.u.custom.gates.len)
                            {
                                apicli_print_complete(session, BCM_ERR_PARM, "epon_logical_link_options.registration_gate_mode.gates.flags is a different size than other arrays in the struct\n");
                                return BCM_ERR_PARM;
                            }

                            for (i0 = 0; i0 < val.registration_gate_mode.u.custom.gates.len; i0++)
                            {
                                val.registration_gate_mode.u.custom.gates.val[i0].flags = (bcmolt_mpcp_registration_gate_flags) cli_parm->values[i0].enum_val;
                            }
                        }

                        cli_parm = bcmcli_find_named_parm(session, "epon_logical_link_options.registration_gate_mode.gates.delay_before_ms");
                        if (cli_parm != NULL)
                        {
                            if (cli_parm->array_size != val.registration_gate_mode.u.custom.gates.len)
                            {
                                apicli_print_complete(session, BCM_ERR_PARM, "epon_logical_link_options.registration_gate_mode.gates.delay_before_ms is a different size than other arrays in the struct\n");
                                return BCM_ERR_PARM;
                            }

                            for (i0 = 0; i0 < val.registration_gate_mode.u.custom.gates.len; i0++)
                            {
                                val.registration_gate_mode.u.custom.gates.val[i0].delay_before_ms = cli_parm->values[i0].unumber;
                            }
                        }

                        cli_parm = bcmcli_find_named_parm(session, "epon_logical_link_options.registration_gate_mode.gates.gate_size_tq");
                        if (cli_parm != NULL)
                        {
                            if (cli_parm->array_size != val.registration_gate_mode.u.custom.gates.len)
                            {
                                apicli_print_complete(session, BCM_ERR_PARM, "epon_logical_link_options.registration_gate_mode.gates.gate_size_tq is a different size than other arrays in the struct\n");
                                return BCM_ERR_PARM;
                            }

                            for (i0 = 0; i0 < val.registration_gate_mode.u.custom.gates.len; i0++)
                            {
                                val.registration_gate_mode.u.custom.gates.val[i0].gate_size_tq = (bcmolt_time_quanta) cli_parm->values[i0].unumber;
                            }
                        }
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "epon_logical_link_options.registration_gate_mode.gates is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                default:
                    apicli_print_complete(session, BCM_ERR_RANGE, "\n");
                    return BCM_ERR_RANGE;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "epon_logical_link_options.registration_gate_mode is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "epon_logical_link_options.reporting_mode");
        if (cli_parm != NULL)
        {
            val.reporting_mode = (bcmolt_epon_dba_reporting_mode) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "epon_logical_link_options.reporting_mode is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "epon_logical_link_options.max_links");
        if (cli_parm != NULL)
        {
            val.max_links = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "epon_logical_link_options.max_links is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_ni, epon_logical_link_options, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_epon_logical_link_options val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_NI_CFG_ID_EPON_LOGICAL_LINK_OPTIONS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_ni, epon_logical_link_options, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "mpcp_discovery_period_ms");
    if (cli_parm != NULL)
    {
        uint32_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, epon_ni, mpcp_discovery_period_ms, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_ni, mpcp_discovery_period_ms, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_NI_CFG_ID_MPCP_DISCOVERY_PERIOD_MS, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "encryption_cfg.");
    if (cli_parm != NULL)
    {
        bcmolt_epon_ni_encryption_cfg val = { };
        cli_parm = bcmcli_find_named_parm(session, "encryption_cfg.downstream_encryption_mode");
        if (cli_parm != NULL)
        {
            val.downstream_encryption_mode = (bcmolt_epon_encryption_mode) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "encryption_cfg.downstream_encryption_mode is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "encryption_cfg.upstream_encryption_mode");
        if (cli_parm != NULL)
        {
            val.upstream_encryption_mode = (bcmolt_epon_encryption_mode) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "encryption_cfg.upstream_encryption_mode is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_ni, encryption_cfg, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_epon_ni_encryption_cfg val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_NI_CFG_ID_ENCRYPTION_CFG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_ni, encryption_cfg, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "protection_switching_cfg.");
    if (cli_parm != NULL)
    {
        bcmolt_epon_protection_switching_configuration val = { };
        cli_parm = bcmcli_find_named_parm(session, "protection_switching_cfg.protection_type");
        if (cli_parm != NULL)
        {
            val.protection_type = (bcmolt_epon_protection_switching_type) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "protection_switching_cfg.protection_type is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "protection_switching_cfg.protection_switching_options");
        if (cli_parm != NULL)
        {
            val.protection_switching_options = (bcmolt_protection_switching_detection_options) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "protection_switching_cfg.protection_switching_options is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "protection_switching_cfg.rerange_options");
        if (cli_parm != NULL)
        {
            val.rerange_options = (bcmolt_epon_protection_switching_reranging_options) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "protection_switching_cfg.rerange_options is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "protection_switching_cfg.rerange_attempts");
        if (cli_parm != NULL)
        {
            val.rerange_attempts = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "protection_switching_cfg.rerange_attempts is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "protection_switching_cfg.rerange_interval");
        if (cli_parm != NULL)
        {
            val.rerange_interval = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "protection_switching_cfg.rerange_interval is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "protection_switching_cfg.sync_gate_duration");
        if (cli_parm != NULL)
        {
            val.sync_gate_duration = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "protection_switching_cfg.sync_gate_duration is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "protection_switching_cfg.gpio_input");
        if (cli_parm != NULL)
        {
            val.gpio_input = (bcmolt_gpio_pin) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "protection_switching_cfg.gpio_input is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "protection_switching_cfg.gpio_input_polarity");
        if (cli_parm != NULL)
        {
            val.gpio_input_polarity = (bcmolt_gpio_polarity) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "protection_switching_cfg.gpio_input_polarity is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "protection_switching_cfg.gpio_output");
        if (cli_parm != NULL)
        {
            val.gpio_output = (bcmolt_gpio_pin) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "protection_switching_cfg.gpio_output is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "protection_switching_cfg.gpio_output_polarity");
        if (cli_parm != NULL)
        {
            val.gpio_output_polarity = (bcmolt_gpio_polarity) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "protection_switching_cfg.gpio_output_polarity is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_ni, protection_switching_cfg, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_epon_protection_switching_configuration val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_NI_CFG_ID_PROTECTION_SWITCHING_CFG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_ni, protection_switching_cfg, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "clock_transport_cfg.");
    if (cli_parm != NULL)
    {
        bcmolt_epon_clock_transport_configuration val = { };
        cli_parm = bcmcli_find_named_parm(session, "clock_transport_cfg.epon_clock_transport_mode");
        if (cli_parm != NULL)
        {
            val.epon_clock_transport_mode = (bcmolt_epon_clock_transport_mode) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "clock_transport_cfg.epon_clock_transport_mode is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_ni, clock_transport_cfg, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_epon_clock_transport_configuration val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_NI_CFG_ID_CLOCK_TRANSPORT_CFG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_ni, clock_transport_cfg, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "dropdown_weights.");
    if (cli_parm != NULL)
    {
        bcmolt_arr_u16_7 val = { };
        cli_parm = bcmcli_find_named_parm(session, "dropdown_weights.arr");
        if (cli_parm != NULL)
        {
            int32_t i1;
            if (cli_parm->array_size != 7)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "array dropdown_weights.arr must have 7 elements\n");
                return BCM_ERR_PARM;
            }

            for (i1 = 0; i1 < 7; i1++)
            {
                val.arr[i1] = cli_parm->values[i1].unumber;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "dropdown_weights.arr is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_ni, dropdown_weights, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_arr_u16_7 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_NI_CFG_ID_DROPDOWN_WEIGHTS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_ni, dropdown_weights, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "no_reports_soak_time");
    if (cli_parm != NULL)
    {
        uint16_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, epon_ni, no_reports_soak_time, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_ni, no_reports_soak_time, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_NI_CFG_ID_NO_REPORTS_SOAK_TIME, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "pon_aggregate_shaper.");
    if (cli_parm != NULL)
    {
        bcmolt_pon_aggregate_shaper val = { };
        cli_parm = bcmcli_find_named_parm(session, "pon_aggregate_shaper.bandwidth_kbps");
        if (cli_parm != NULL)
        {
            val.bandwidth_kbps = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "pon_aggregate_shaper.bandwidth_kbps is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "pon_aggregate_shaper.mbs_kB");
        if (cli_parm != NULL)
        {
            val.mbs_kB = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "pon_aggregate_shaper.mbs_kB is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_ni, pon_aggregate_shaper, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_pon_aggregate_shaper val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_NI_CFG_ID_PON_AGGREGATE_SHAPER, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_ni, pon_aggregate_shaper, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "onu_upgrade_params.");
    if (cli_parm != NULL)
    {
        bcmolt_epon_onu_upgrade_params val = { };
        cli_parm = bcmcli_find_named_parm(session, "onu_upgrade_params.oam_extension_type");
        if (cli_parm != NULL)
        {
            val.oam_extension_type = (bcmolt_epon_oam_extension_type) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "onu_upgrade_params.oam_extension_type is not set\n");
            return BCM_ERR_PARM;
        }

        switch (val.oam_extension_type)
        {
            case BCMOLT_EPON_OAM_EXTENSION_TYPE_RESERVED:
                break;
            case BCMOLT_EPON_OAM_EXTENSION_TYPE_BROADCOM:
                cli_parm = bcmcli_find_named_parm(session, "onu_upgrade_params.response_timeout_ms");
                if (cli_parm != NULL)
                {
                    val.u.broadcom.response_timeout_ms = cli_parm->value.unumber;
                }
                else
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "onu_upgrade_params.response_timeout_ms is not set\n");
                    return BCM_ERR_PARM;
                }
                break;
            case BCMOLT_EPON_OAM_EXTENSION_TYPE_CTC:
                cli_parm = bcmcli_find_named_parm(session, "onu_upgrade_params.response_timeout_ms");
                if (cli_parm != NULL)
                {
                    val.u.ctc.response_timeout_ms = cli_parm->value.unumber;
                }
                else
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "onu_upgrade_params.response_timeout_ms is not set\n");
                    return BCM_ERR_PARM;
                }
                break;
            case BCMOLT_EPON_OAM_EXTENSION_TYPE_DASAN:
                cli_parm = bcmcli_find_named_parm(session, "onu_upgrade_params.response_timeout_ms");
                if (cli_parm != NULL)
                {
                    val.u.dasan.response_timeout_ms = cli_parm->value.unumber;
                }
                else
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "onu_upgrade_params.response_timeout_ms is not set\n");
                    return BCM_ERR_PARM;
                }
                break;
            case BCMOLT_EPON_OAM_EXTENSION_TYPE_KT:
                cli_parm = bcmcli_find_named_parm(session, "onu_upgrade_params.response_timeout_ms");
                if (cli_parm != NULL)
                {
                    val.u.kt.response_timeout_ms = cli_parm->value.unumber;
                }
                else
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "onu_upgrade_params.response_timeout_ms is not set\n");
                    return BCM_ERR_PARM;
                }
                break;
            case BCMOLT_EPON_OAM_EXTENSION_TYPE_DPOE:
                cli_parm = bcmcli_find_named_parm(session, "onu_upgrade_params.response_timeout_ms");
                if (cli_parm != NULL)
                {
                    val.u.dpoe.response_timeout_ms = cli_parm->value.unumber;
                }
                else
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "onu_upgrade_params.response_timeout_ms is not set\n");
                    return BCM_ERR_PARM;
                }

                cli_parm = bcmcli_find_named_parm(session, "onu_upgrade_params.block_size");
                if (cli_parm != NULL)
                {
                    val.u.dpoe.block_size = cli_parm->value.unumber;
                }
                else
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "onu_upgrade_params.block_size is not set\n");
                    return BCM_ERR_PARM;
                }

                cli_parm = bcmcli_find_named_parm(session, "onu_upgrade_params.final_ack_response_timeout");
                if (cli_parm != NULL)
                {
                    val.u.dpoe.final_ack_response_timeout = cli_parm->value.unumber;
                }
                else
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "onu_upgrade_params.final_ack_response_timeout is not set\n");
                    return BCM_ERR_PARM;
                }
                break;
            default:
                apicli_print_complete(session, BCM_ERR_RANGE, "\n");
                return BCM_ERR_RANGE;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_ni, onu_upgrade_params, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_epon_onu_upgrade_params val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_NI_CFG_ID_ONU_UPGRADE_PARAMS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_ni, onu_upgrade_params, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "auto_rogue_detect_10g_en");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, epon_ni, auto_rogue_detect_10g_en, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_ni, auto_rogue_detect_10g_en, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_NI_CFG_ID_AUTO_ROGUE_DETECT_10G_EN, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "auto_rogue_detect_1g_en");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, epon_ni, auto_rogue_detect_1g_en, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_ni, auto_rogue_detect_1g_en, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_NI_CFG_ID_AUTO_ROGUE_DETECT_1G_EN, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "auto_rogue_detect_10g_threshold");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, epon_ni, auto_rogue_detect_10g_threshold, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_ni, auto_rogue_detect_10g_threshold, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_NI_CFG_ID_AUTO_ROGUE_DETECT_10G_THRESHOLD, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_cfg_set(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_set(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_ni_cfg_clear(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_ni_cfg cfg;         /**< declare main API struct */
    bcmolt_epon_ni_key key = { };   /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_ni_cfg cfg;\n");
    bcmcli_log("bcmolt_epon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_clear");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_NI_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, epon_ni, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, epon_ni, key);\n");

    /* call API */
    err = bcmolt_cfg_clear(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_clear(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_ni_cfg_get_multi(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_ni_cfg cfg;         /**< declare main API struct */
    bcmolt_epon_ni_key key = { };   /**< declare key */
    bcmolt_msg_set *msg_set = NULL; /**< declare message set */
    uint32_t max_msgs;              /**< declare max number of msgs to get */
    bcmos_bool invert_filter;       /**< declare filter invert flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_ni_cfg cfg;\n");
    bcmcli_log("bcmolt_epon_ni_key key = {  };\n");
    bcmcli_log("bcmolt_msg_set* msg_set = NULL;\n");
    bcmcli_log("uint32_t max_msgs;\n");
    bcmcli_log("bcmos_bool invert_filter;\n");
    apicli_print_start(session, "bcmolt_cfg_get_multi");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_NI_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");

    /* set max number of msgs from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "max_msgs");
    if (cli_parm != NULL)
    {
        max_msgs = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "max_msgs is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("max_msgs = %d;\n", max_msgs);

    /* set filter invert flag from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "filter_invert");
    if (cli_parm != NULL)
    {
        invert_filter = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "filter_invert is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("invert_filter = %s;\n", (invert_filter) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* allocate message set */
    err = apicli_msg_set_alloc(byte_pool, BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);
    if (err != BCM_ERR_OK)
    {
        return err;
    }

    bcmcli_log("bcmolt_msg_set_alloc(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, epon_ni, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, epon_ni, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "filter.mac_address");
    if (cli_parm != NULL)
    {
        bcmos_mac_address val;
        val = cli_parm->value.mac;
        BCMOLT_CFG_PROP_SET(&cfg, epon_ni, mac_address, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_ni, mac_address, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_NI_CFG_ID_MAC_ADDRESS, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "mac_address");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, mac_address);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, mac_address);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.epon_ni_en");
    if (cli_parm != NULL)
    {
        bcmolt_epon_ni_en_state val;
        val = (bcmolt_epon_ni_en_state) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, epon_ni, epon_ni_en, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_ni, epon_ni_en, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_NI_CFG_ID_EPON_NI_EN, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "epon_ni_en");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, epon_ni_en);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, epon_ni_en);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.registration_behavior");
    if (cli_parm != NULL)
    {
        bcmolt_registration_behavior val;
        val = (bcmolt_registration_behavior) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, epon_ni, registration_behavior, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_ni, registration_behavior, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_NI_CFG_ID_REGISTRATION_BEHAVIOR, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "registration_behavior");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, registration_behavior);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, registration_behavior);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.mtu_1g");
    if (cli_parm != NULL)
    {
        uint16_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, epon_ni, mtu_1g, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_ni, mtu_1g, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_NI_CFG_ID_MTU_1G, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "mtu_1g");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, mtu_1g);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, mtu_1g);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.mtu_10g");
    if (cli_parm != NULL)
    {
        uint16_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, epon_ni, mtu_10g, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_ni, mtu_10g, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_NI_CFG_ID_MTU_10G, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "mtu_10g");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, mtu_10g);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, mtu_10g);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.minimum_fiber_length");
    if (cli_parm != NULL)
    {
        bcmolt_meters val;
        val = (bcmolt_meters) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, epon_ni, minimum_fiber_length, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_ni, minimum_fiber_length, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_NI_CFG_ID_MINIMUM_FIBER_LENGTH, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "minimum_fiber_length");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, minimum_fiber_length);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, minimum_fiber_length);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.maximum_fiber_length");
    if (cli_parm != NULL)
    {
        bcmolt_meters val;
        val = (bcmolt_meters) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, epon_ni, maximum_fiber_length, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_ni, maximum_fiber_length, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_NI_CFG_ID_MAXIMUM_FIBER_LENGTH, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "maximum_fiber_length");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, maximum_fiber_length);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, maximum_fiber_length);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.grant_spacing_tq");
    if (cli_parm != NULL)
    {
        bcmolt_time_quanta val;
        val = (bcmolt_time_quanta) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, epon_ni, grant_spacing_tq, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_ni, grant_spacing_tq, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_NI_CFG_ID_GRANT_SPACING_TQ, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "grant_spacing_tq");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, grant_spacing_tq);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, grant_spacing_tq);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.epon_logical_link_options.");
    if (cli_parm != NULL)
    {
        bcmolt_epon_logical_link_options val = { };
        cli_parm = bcmcli_find_parm_by_prefix(session, "filter.epon_logical_link_options.registration_gate_mode.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "filter.epon_logical_link_options.registration_gate_mode.registration_gate_mode");
            if (cli_parm != NULL)
            {
                val.registration_gate_mode.registration_gate_mode = (bcmolt_mpcp_gate_mode) cli_parm->value.enum_val;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.epon_logical_link_options.registration_gate_mode.registration_gate_mode is not set\n");
                return BCM_ERR_PARM;
            }

            switch (val.registration_gate_mode.registration_gate_mode)
            {
                case BCMOLT_MPCP_GATE_MODE_TEKNOVUS:
                    cli_parm = bcmcli_find_named_parm(session, "filter.epon_logical_link_options.registration_gate_mode.reg_ack_timeout_ms");
                    if (cli_parm != NULL)
                    {
                        val.registration_gate_mode.u.teknovus.reg_ack_timeout_ms = cli_parm->value.unumber;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "filter.epon_logical_link_options.registration_gate_mode.reg_ack_timeout_ms is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_MPCP_GATE_MODE_CUSTOM:
                    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.epon_logical_link_options.registration_gate_mode.gates.");
                    if (cli_parm != NULL)
                    {
                        int32_t i0;
                        val.registration_gate_mode.u.custom.gates.val = apicli_byte_pool_calloc(byte_pool, cli_parm->array_size * sizeof(*val.registration_gate_mode.u.custom.gates.val));
                        if (val.registration_gate_mode.u.custom.gates.val == NULL)
                        {
                            apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
                            return BCM_ERR_NOMEM;
                        }

                        val.registration_gate_mode.u.custom.gates.len = cli_parm->array_size;
                        cli_parm = bcmcli_find_named_parm(session, "filter.epon_logical_link_options.registration_gate_mode.gates.flags");
                        if (cli_parm != NULL)
                        {
                            if (cli_parm->array_size != val.registration_gate_mode.u.custom.gates.len)
                            {
                                apicli_print_complete(session, BCM_ERR_PARM, "filter.epon_logical_link_options.registration_gate_mode.gates.flags is a different size than other arrays in the struct\n");
                                return BCM_ERR_PARM;
                            }

                            for (i0 = 0; i0 < val.registration_gate_mode.u.custom.gates.len; i0++)
                            {
                                val.registration_gate_mode.u.custom.gates.val[i0].flags = (bcmolt_mpcp_registration_gate_flags) cli_parm->values[i0].enum_val;
                            }
                        }

                        cli_parm = bcmcli_find_named_parm(session, "filter.epon_logical_link_options.registration_gate_mode.gates.delay_before_ms");
                        if (cli_parm != NULL)
                        {
                            if (cli_parm->array_size != val.registration_gate_mode.u.custom.gates.len)
                            {
                                apicli_print_complete(session, BCM_ERR_PARM, "filter.epon_logical_link_options.registration_gate_mode.gates.delay_before_ms is a different size than other arrays in the struct\n");
                                return BCM_ERR_PARM;
                            }

                            for (i0 = 0; i0 < val.registration_gate_mode.u.custom.gates.len; i0++)
                            {
                                val.registration_gate_mode.u.custom.gates.val[i0].delay_before_ms = cli_parm->values[i0].unumber;
                            }
                        }

                        cli_parm = bcmcli_find_named_parm(session, "filter.epon_logical_link_options.registration_gate_mode.gates.gate_size_tq");
                        if (cli_parm != NULL)
                        {
                            if (cli_parm->array_size != val.registration_gate_mode.u.custom.gates.len)
                            {
                                apicli_print_complete(session, BCM_ERR_PARM, "filter.epon_logical_link_options.registration_gate_mode.gates.gate_size_tq is a different size than other arrays in the struct\n");
                                return BCM_ERR_PARM;
                            }

                            for (i0 = 0; i0 < val.registration_gate_mode.u.custom.gates.len; i0++)
                            {
                                val.registration_gate_mode.u.custom.gates.val[i0].gate_size_tq = (bcmolt_time_quanta) cli_parm->values[i0].unumber;
                            }
                        }
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "filter.epon_logical_link_options.registration_gate_mode.gates is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                default:
                    apicli_print_complete(session, BCM_ERR_RANGE, "\n");
                    return BCM_ERR_RANGE;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.epon_logical_link_options.registration_gate_mode is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.epon_logical_link_options.reporting_mode");
        if (cli_parm != NULL)
        {
            val.reporting_mode = (bcmolt_epon_dba_reporting_mode) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.epon_logical_link_options.reporting_mode is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.epon_logical_link_options.max_links");
        if (cli_parm != NULL)
        {
            val.max_links = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.epon_logical_link_options.max_links is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_ni, epon_logical_link_options, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_epon_logical_link_options val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_NI_CFG_ID_EPON_LOGICAL_LINK_OPTIONS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_ni, epon_logical_link_options, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "epon_logical_link_options");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, epon_logical_link_options);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, epon_logical_link_options);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.mpcp_discovery_period_ms");
    if (cli_parm != NULL)
    {
        uint32_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, epon_ni, mpcp_discovery_period_ms, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_ni, mpcp_discovery_period_ms, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_NI_CFG_ID_MPCP_DISCOVERY_PERIOD_MS, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "mpcp_discovery_period_ms");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, mpcp_discovery_period_ms);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, mpcp_discovery_period_ms);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.alarm_state.");
    if (cli_parm != NULL)
    {
        bcmolt_epon_ni_alarm_state val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.alarm_state.no_reports");
        if (cli_parm != NULL)
        {
            val.no_reports = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.no_reports is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_ni, alarm_state, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_epon_ni_alarm_state val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_NI_CFG_ID_ALARM_STATE, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_ni, alarm_state, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "alarm_state");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, alarm_state);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, alarm_state);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.all_links");
    if (cli_parm != NULL)
    {
        bcmolt_macaddress_list_u32_max_2048 val = { };
        int32_t i1;
        val.val = apicli_byte_pool_calloc(byte_pool, cli_parm->array_size * sizeof(*val.val));
        if (val.val == NULL)
        {
            apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
            return BCM_ERR_NOMEM;
        }

        val.len = cli_parm->array_size;
        for (i1 = 0; i1 < val.len; i1++)
        {
            val.val[i1] = cli_parm->values[i1].mac;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_ni, all_links, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_macaddress_list_u32_max_2048 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_NI_CFG_ID_ALL_LINKS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_ni, all_links, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "all_links");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, all_links);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, all_links);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.encryption_cfg.");
    if (cli_parm != NULL)
    {
        bcmolt_epon_ni_encryption_cfg val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.encryption_cfg.downstream_encryption_mode");
        if (cli_parm != NULL)
        {
            val.downstream_encryption_mode = (bcmolt_epon_encryption_mode) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.encryption_cfg.downstream_encryption_mode is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.encryption_cfg.upstream_encryption_mode");
        if (cli_parm != NULL)
        {
            val.upstream_encryption_mode = (bcmolt_epon_encryption_mode) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.encryption_cfg.upstream_encryption_mode is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_ni, encryption_cfg, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_epon_ni_encryption_cfg val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_NI_CFG_ID_ENCRYPTION_CFG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_ni, encryption_cfg, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "encryption_cfg");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, encryption_cfg);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, encryption_cfg);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.protection_switching_cfg.");
    if (cli_parm != NULL)
    {
        bcmolt_epon_protection_switching_configuration val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.protection_switching_cfg.protection_type");
        if (cli_parm != NULL)
        {
            val.protection_type = (bcmolt_epon_protection_switching_type) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.protection_switching_cfg.protection_type is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.protection_switching_cfg.protection_switching_options");
        if (cli_parm != NULL)
        {
            val.protection_switching_options = (bcmolt_protection_switching_detection_options) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.protection_switching_cfg.protection_switching_options is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.protection_switching_cfg.rerange_options");
        if (cli_parm != NULL)
        {
            val.rerange_options = (bcmolt_epon_protection_switching_reranging_options) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.protection_switching_cfg.rerange_options is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.protection_switching_cfg.rerange_attempts");
        if (cli_parm != NULL)
        {
            val.rerange_attempts = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.protection_switching_cfg.rerange_attempts is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.protection_switching_cfg.rerange_interval");
        if (cli_parm != NULL)
        {
            val.rerange_interval = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.protection_switching_cfg.rerange_interval is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.protection_switching_cfg.sync_gate_duration");
        if (cli_parm != NULL)
        {
            val.sync_gate_duration = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.protection_switching_cfg.sync_gate_duration is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.protection_switching_cfg.gpio_input");
        if (cli_parm != NULL)
        {
            val.gpio_input = (bcmolt_gpio_pin) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.protection_switching_cfg.gpio_input is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.protection_switching_cfg.gpio_input_polarity");
        if (cli_parm != NULL)
        {
            val.gpio_input_polarity = (bcmolt_gpio_polarity) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.protection_switching_cfg.gpio_input_polarity is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.protection_switching_cfg.gpio_output");
        if (cli_parm != NULL)
        {
            val.gpio_output = (bcmolt_gpio_pin) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.protection_switching_cfg.gpio_output is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.protection_switching_cfg.gpio_output_polarity");
        if (cli_parm != NULL)
        {
            val.gpio_output_polarity = (bcmolt_gpio_polarity) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.protection_switching_cfg.gpio_output_polarity is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_ni, protection_switching_cfg, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_epon_protection_switching_configuration val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_NI_CFG_ID_PROTECTION_SWITCHING_CFG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_ni, protection_switching_cfg, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "protection_switching_cfg");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, protection_switching_cfg);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, protection_switching_cfg);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.clock_transport_cfg.");
    if (cli_parm != NULL)
    {
        bcmolt_epon_clock_transport_configuration val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.clock_transport_cfg.epon_clock_transport_mode");
        if (cli_parm != NULL)
        {
            val.epon_clock_transport_mode = (bcmolt_epon_clock_transport_mode) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.clock_transport_cfg.epon_clock_transport_mode is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_ni, clock_transport_cfg, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_epon_clock_transport_configuration val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_NI_CFG_ID_CLOCK_TRANSPORT_CFG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_ni, clock_transport_cfg, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "clock_transport_cfg");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, clock_transport_cfg);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, clock_transport_cfg);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.dropdown_weights.");
    if (cli_parm != NULL)
    {
        bcmolt_arr_u16_7 val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.dropdown_weights.arr");
        if (cli_parm != NULL)
        {
            int32_t i2;
            if (cli_parm->array_size != 7)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "array filter.dropdown_weights.arr must have 7 elements\n");
                return BCM_ERR_PARM;
            }

            for (i2 = 0; i2 < 7; i2++)
            {
                val.arr[i2] = cli_parm->values[i2].unumber;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.dropdown_weights.arr is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_ni, dropdown_weights, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_arr_u16_7 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_NI_CFG_ID_DROPDOWN_WEIGHTS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_ni, dropdown_weights, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "dropdown_weights");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, dropdown_weights);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, dropdown_weights);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.approximate_solicited_usage.");
    if (cli_parm != NULL)
    {
        bcmolt_arr_bounds_8 val = { };
        cli_parm = bcmcli_find_parm_by_prefix(session, "filter.approximate_solicited_usage.arr.");
        if (cli_parm != NULL)
        {
            int32_t i3;
            if (cli_parm->array_size != 8)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "array filter.approximate_solicited_usage.arr must have 8 elements\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.approximate_solicited_usage.arr.best_case");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 8)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.approximate_solicited_usage.arr.best_case is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i3 = 0; i3 < 8; i3++)
                {
                    val.arr[i3].best_case = cli_parm->values[i3].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.approximate_solicited_usage.arr.worst_case");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 8)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.approximate_solicited_usage.arr.worst_case is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i3 = 0; i3 < 8; i3++)
                {
                    val.arr[i3].worst_case = cli_parm->values[i3].unumber;
                }
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.approximate_solicited_usage.arr is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_ni, approximate_solicited_usage, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_arr_bounds_8 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_NI_CFG_ID_APPROXIMATE_SOLICITED_USAGE, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_ni, approximate_solicited_usage, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "approximate_solicited_usage");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, approximate_solicited_usage);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, approximate_solicited_usage);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.approximate_tdm_usage");
    if (cli_parm != NULL)
    {
        uint32_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, epon_ni, approximate_tdm_usage, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_ni, approximate_tdm_usage, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_NI_CFG_ID_APPROXIMATE_TDM_USAGE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "approximate_tdm_usage");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, approximate_tdm_usage);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, approximate_tdm_usage);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.no_reports_soak_time");
    if (cli_parm != NULL)
    {
        uint16_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, epon_ni, no_reports_soak_time, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_ni, no_reports_soak_time, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_NI_CFG_ID_NO_REPORTS_SOAK_TIME, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "no_reports_soak_time");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, no_reports_soak_time);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, no_reports_soak_time);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.pon_aggregate_shaper.");
    if (cli_parm != NULL)
    {
        bcmolt_pon_aggregate_shaper val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.pon_aggregate_shaper.bandwidth_kbps");
        if (cli_parm != NULL)
        {
            val.bandwidth_kbps = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.pon_aggregate_shaper.bandwidth_kbps is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.pon_aggregate_shaper.mbs_kB");
        if (cli_parm != NULL)
        {
            val.mbs_kB = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.pon_aggregate_shaper.mbs_kB is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_ni, pon_aggregate_shaper, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_pon_aggregate_shaper val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_NI_CFG_ID_PON_AGGREGATE_SHAPER, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_ni, pon_aggregate_shaper, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "pon_aggregate_shaper");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, pon_aggregate_shaper);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, pon_aggregate_shaper);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.estimated_pon_latency_tq.");
    if (cli_parm != NULL)
    {
        bcmolt_arr_bounds_8 val = { };
        cli_parm = bcmcli_find_parm_by_prefix(session, "filter.estimated_pon_latency_tq.arr.");
        if (cli_parm != NULL)
        {
            int32_t i4;
            if (cli_parm->array_size != 8)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "array filter.estimated_pon_latency_tq.arr must have 8 elements\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.estimated_pon_latency_tq.arr.best_case");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 8)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.estimated_pon_latency_tq.arr.best_case is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i4 = 0; i4 < 8; i4++)
                {
                    val.arr[i4].best_case = cli_parm->values[i4].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.estimated_pon_latency_tq.arr.worst_case");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 8)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.estimated_pon_latency_tq.arr.worst_case is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i4 = 0; i4 < 8; i4++)
                {
                    val.arr[i4].worst_case = cli_parm->values[i4].unumber;
                }
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.estimated_pon_latency_tq.arr is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_ni, estimated_pon_latency_tq, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_arr_bounds_8 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_NI_CFG_ID_ESTIMATED_PON_LATENCY_TQ, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_ni, estimated_pon_latency_tq, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "estimated_pon_latency_tq");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, estimated_pon_latency_tq);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, estimated_pon_latency_tq);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.onu_upgrade_params.");
    if (cli_parm != NULL)
    {
        bcmolt_epon_onu_upgrade_params val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.onu_upgrade_params.oam_extension_type");
        if (cli_parm != NULL)
        {
            val.oam_extension_type = (bcmolt_epon_oam_extension_type) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.onu_upgrade_params.oam_extension_type is not set\n");
            return BCM_ERR_PARM;
        }

        switch (val.oam_extension_type)
        {
            case BCMOLT_EPON_OAM_EXTENSION_TYPE_RESERVED:
                break;
            case BCMOLT_EPON_OAM_EXTENSION_TYPE_BROADCOM:
                cli_parm = bcmcli_find_named_parm(session, "filter.onu_upgrade_params.response_timeout_ms");
                if (cli_parm != NULL)
                {
                    val.u.broadcom.response_timeout_ms = cli_parm->value.unumber;
                }
                else
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.onu_upgrade_params.response_timeout_ms is not set\n");
                    return BCM_ERR_PARM;
                }
                break;
            case BCMOLT_EPON_OAM_EXTENSION_TYPE_CTC:
                cli_parm = bcmcli_find_named_parm(session, "filter.onu_upgrade_params.response_timeout_ms");
                if (cli_parm != NULL)
                {
                    val.u.ctc.response_timeout_ms = cli_parm->value.unumber;
                }
                else
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.onu_upgrade_params.response_timeout_ms is not set\n");
                    return BCM_ERR_PARM;
                }
                break;
            case BCMOLT_EPON_OAM_EXTENSION_TYPE_DASAN:
                cli_parm = bcmcli_find_named_parm(session, "filter.onu_upgrade_params.response_timeout_ms");
                if (cli_parm != NULL)
                {
                    val.u.dasan.response_timeout_ms = cli_parm->value.unumber;
                }
                else
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.onu_upgrade_params.response_timeout_ms is not set\n");
                    return BCM_ERR_PARM;
                }
                break;
            case BCMOLT_EPON_OAM_EXTENSION_TYPE_KT:
                cli_parm = bcmcli_find_named_parm(session, "filter.onu_upgrade_params.response_timeout_ms");
                if (cli_parm != NULL)
                {
                    val.u.kt.response_timeout_ms = cli_parm->value.unumber;
                }
                else
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.onu_upgrade_params.response_timeout_ms is not set\n");
                    return BCM_ERR_PARM;
                }
                break;
            case BCMOLT_EPON_OAM_EXTENSION_TYPE_DPOE:
                cli_parm = bcmcli_find_named_parm(session, "filter.onu_upgrade_params.response_timeout_ms");
                if (cli_parm != NULL)
                {
                    val.u.dpoe.response_timeout_ms = cli_parm->value.unumber;
                }
                else
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.onu_upgrade_params.response_timeout_ms is not set\n");
                    return BCM_ERR_PARM;
                }

                cli_parm = bcmcli_find_named_parm(session, "filter.onu_upgrade_params.block_size");
                if (cli_parm != NULL)
                {
                    val.u.dpoe.block_size = cli_parm->value.unumber;
                }
                else
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.onu_upgrade_params.block_size is not set\n");
                    return BCM_ERR_PARM;
                }

                cli_parm = bcmcli_find_named_parm(session, "filter.onu_upgrade_params.final_ack_response_timeout");
                if (cli_parm != NULL)
                {
                    val.u.dpoe.final_ack_response_timeout = cli_parm->value.unumber;
                }
                else
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.onu_upgrade_params.final_ack_response_timeout is not set\n");
                    return BCM_ERR_PARM;
                }
                break;
            default:
                apicli_print_complete(session, BCM_ERR_RANGE, "\n");
                return BCM_ERR_RANGE;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_ni, onu_upgrade_params, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_epon_onu_upgrade_params val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_NI_CFG_ID_ONU_UPGRADE_PARAMS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_ni, onu_upgrade_params, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_upgrade_params");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, onu_upgrade_params);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, onu_upgrade_params);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.auto_rogue_detect_10g_en");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, epon_ni, auto_rogue_detect_10g_en, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_ni, auto_rogue_detect_10g_en, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_NI_CFG_ID_AUTO_ROGUE_DETECT_10G_EN, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "auto_rogue_detect_10g_en");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, auto_rogue_detect_10g_en);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, auto_rogue_detect_10g_en);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.auto_rogue_detect_1g_en");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, epon_ni, auto_rogue_detect_1g_en, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_ni, auto_rogue_detect_1g_en, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_NI_CFG_ID_AUTO_ROGUE_DETECT_1G_EN, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "auto_rogue_detect_1g_en");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, auto_rogue_detect_1g_en);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, auto_rogue_detect_1g_en);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.auto_rogue_detect_10g_threshold");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, epon_ni, auto_rogue_detect_10g_threshold, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_ni, auto_rogue_detect_10g_threshold, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_NI_CFG_ID_AUTO_ROGUE_DETECT_10G_THRESHOLD, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "auto_rogue_detect_10g_threshold");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, auto_rogue_detect_10g_threshold);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, auto_rogue_detect_10g_threshold);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_ni, mac_address) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_ni, epon_ni_en) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_ni, registration_behavior) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_ni, mtu_1g) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_ni, mtu_10g) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_ni, minimum_fiber_length) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_ni, maximum_fiber_length) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_ni, grant_spacing_tq) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_ni, epon_logical_link_options) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_ni, mpcp_discovery_period_ms) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_ni, alarm_state) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_ni, all_links) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_ni, encryption_cfg) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_ni, protection_switching_cfg) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_ni, clock_transport_cfg) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_ni, dropdown_weights) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_ni, approximate_solicited_usage) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_ni, approximate_tdm_usage) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_ni, no_reports_soak_time) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_ni, pon_aggregate_shaper) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_ni, estimated_pon_latency_tq) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_ni, onu_upgrade_params) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_ni, auto_rogue_detect_10g_en) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_ni, auto_rogue_detect_1g_en) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_ni, auto_rogue_detect_10g_threshold))
    {
        BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, all_properties);
        bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_ni, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);
    bcmcli_log("bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_ni_oper_set_epon_ni_en_state_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_ni_set_epon_ni_en_state oper;   /**< declare main API struct */
    bcmolt_epon_ni_key key = { };               /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_ni_set_epon_ni_en_state oper;\n");
    bcmcli_log("bcmolt_epon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_NI_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, epon_ni, set_epon_ni_en_state, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, epon_ni, set_epon_ni_en_state, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "new_state");
    if (cli_parm != NULL)
    {
        bcmolt_epon_ni_en_state val;
        val = (bcmolt_epon_ni_en_state) cli_parm->value.enum_val;
        BCMOLT_OPER_PROP_SET(&oper, epon_ni, set_epon_ni_en_state, new_state, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, epon_ni, set_epon_ni_en_state, new_state, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_OPER, BCMOLT_EPON_NI_OPER_ID_SET_EPON_NI_EN_STATE, BCMOLT_EPON_NI_SET_EPON_NI_EN_STATE_ID_NEW_STATE, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_ni_oper_issue_rssi_grant_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_ni_issue_rssi_grant oper;   /**< declare main API struct */
    bcmolt_epon_ni_key key = { };           /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_ni_issue_rssi_grant oper;\n");
    bcmcli_log("bcmolt_epon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_NI_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, epon_ni, issue_rssi_grant, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, epon_ni, issue_rssi_grant, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "granted_link");
    if (cli_parm != NULL)
    {
        bcmos_mac_address val;
        val = cli_parm->value.mac;
        BCMOLT_OPER_PROP_SET(&oper, epon_ni, issue_rssi_grant, granted_link, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, epon_ni, issue_rssi_grant, granted_link, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_OPER, BCMOLT_EPON_NI_OPER_ID_ISSUE_RSSI_GRANT, BCMOLT_EPON_NI_ISSUE_RSSI_GRANT_ID_GRANTED_LINK, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "trigger_width");
    if (cli_parm != NULL)
    {
        uint16_t val;
        val = cli_parm->value.unumber;
        BCMOLT_OPER_PROP_SET(&oper, epon_ni, issue_rssi_grant, trigger_width, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, epon_ni, issue_rssi_grant, trigger_width, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_OPER, BCMOLT_EPON_NI_OPER_ID_ISSUE_RSSI_GRANT, BCMOLT_EPON_NI_ISSUE_RSSI_GRANT_ID_TRIGGER_WIDTH, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "trigger_delay");
    if (cli_parm != NULL)
    {
        uint16_t val;
        val = cli_parm->value.unumber;
        BCMOLT_OPER_PROP_SET(&oper, epon_ni, issue_rssi_grant, trigger_delay, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, epon_ni, issue_rssi_grant, trigger_delay, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_OPER, BCMOLT_EPON_NI_OPER_ID_ISSUE_RSSI_GRANT, BCMOLT_EPON_NI_ISSUE_RSSI_GRANT_ID_TRIGGER_DELAY, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "sample_period");
    if (cli_parm != NULL)
    {
        uint16_t val;
        val = cli_parm->value.unumber;
        BCMOLT_OPER_PROP_SET(&oper, epon_ni, issue_rssi_grant, sample_period, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, epon_ni, issue_rssi_grant, sample_period, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_OPER, BCMOLT_EPON_NI_OPER_ID_ISSUE_RSSI_GRANT, BCMOLT_EPON_NI_ISSUE_RSSI_GRANT_ID_SAMPLE_PERIOD, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_ni_oper_add_link_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_ni_add_link oper;   /**< declare main API struct */
    bcmolt_epon_ni_key key = { };   /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_ni_add_link oper;\n");
    bcmcli_log("bcmolt_epon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_NI_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, epon_ni, add_link, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, epon_ni, add_link, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "mac_address");
    if (cli_parm != NULL)
    {
        bcmos_mac_address val;
        val = cli_parm->value.mac;
        BCMOLT_OPER_PROP_SET(&oper, epon_ni, add_link, mac_address, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, epon_ni, add_link, mac_address, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_OPER, BCMOLT_EPON_NI_OPER_ID_ADD_LINK, BCMOLT_EPON_NI_ADD_LINK_ID_MAC_ADDRESS, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rate");
    if (cli_parm != NULL)
    {
        bcmolt_epon_link_rate val;
        val = (bcmolt_epon_link_rate) cli_parm->value.enum_val;
        BCMOLT_OPER_PROP_SET(&oper, epon_ni, add_link, rate, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, epon_ni, add_link, rate, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_OPER, BCMOLT_EPON_NI_OPER_ID_ADD_LINK, BCMOLT_EPON_NI_ADD_LINK_ID_RATE, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_ni_oper_add_multicast_link_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_ni_add_multicast_link oper; /**< declare main API struct */
    bcmolt_epon_ni_key key = { };           /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_ni_add_multicast_link oper;\n");
    bcmcli_log("bcmolt_epon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_NI_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, epon_ni, add_multicast_link, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, epon_ni, add_multicast_link, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "mac_address");
    if (cli_parm != NULL)
    {
        bcmos_mac_address val;
        val = cli_parm->value.mac;
        BCMOLT_OPER_PROP_SET(&oper, epon_ni, add_multicast_link, mac_address, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, epon_ni, add_multicast_link, mac_address, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_OPER, BCMOLT_EPON_NI_OPER_ID_ADD_MULTICAST_LINK, BCMOLT_EPON_NI_ADD_MULTICAST_LINK_ID_MAC_ADDRESS, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rate");
    if (cli_parm != NULL)
    {
        bcmolt_epon_link_rate val;
        val = (bcmolt_epon_link_rate) cli_parm->value.enum_val;
        BCMOLT_OPER_PROP_SET(&oper, epon_ni, add_multicast_link, rate, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, epon_ni, add_multicast_link, rate, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_OPER, BCMOLT_EPON_NI_OPER_ID_ADD_MULTICAST_LINK, BCMOLT_EPON_NI_ADD_MULTICAST_LINK_ID_RATE, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_ni_oper_add_protected_standby_link_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_ni_add_protected_standby_link oper; /**< declare main API struct */
    bcmolt_epon_ni_key key = { };                   /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_ni_add_protected_standby_link oper;\n");
    bcmcli_log("bcmolt_epon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_NI_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, epon_ni, add_protected_standby_link, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, epon_ni, add_protected_standby_link, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "mac_address");
    if (cli_parm != NULL)
    {
        bcmos_mac_address val;
        val = cli_parm->value.mac;
        BCMOLT_OPER_PROP_SET(&oper, epon_ni, add_protected_standby_link, mac_address, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, epon_ni, add_protected_standby_link, mac_address, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_OPER, BCMOLT_EPON_NI_OPER_ID_ADD_PROTECTED_STANDBY_LINK, BCMOLT_EPON_NI_ADD_PROTECTED_STANDBY_LINK_ID_MAC_ADDRESS, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "working_link_info.");
    if (cli_parm != NULL)
    {
        bcmolt_epon_link_info val = { };
        cli_parm = bcmcli_find_named_parm(session, "working_link_info.link_status");
        if (cli_parm != NULL)
        {
            val.link_status = (bcmolt_epon_link_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "working_link_info.link_status is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "working_link_info.rate");
        if (cli_parm != NULL)
        {
            val.rate = (bcmolt_epon_link_rate) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "working_link_info.rate is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "working_link_info.llid");
        if (cli_parm != NULL)
        {
            val.llid = (bcmolt_epon_llid) cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "working_link_info.llid is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "working_link_info.mpcp_discovery_info");
        if (cli_parm != NULL)
        {
            val.mpcp_discovery_info = (bcmolt_mpcp_discovery_info) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "working_link_info.mpcp_discovery_info is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "working_link_info.onu_laser_on_time_tq");
        if (cli_parm != NULL)
        {
            val.onu_laser_on_time_tq = (bcmolt_time_quanta) cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "working_link_info.onu_laser_on_time_tq is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "working_link_info.onu_laser_off_time_tq");
        if (cli_parm != NULL)
        {
            val.onu_laser_off_time_tq = (bcmolt_time_quanta) cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "working_link_info.onu_laser_off_time_tq is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "working_link_info.pending_grants");
        if (cli_parm != NULL)
        {
            val.pending_grants = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "working_link_info.pending_grants is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "working_link_info.range_value_tq");
        if (cli_parm != NULL)
        {
            val.range_value_tq = (bcmolt_time_quanta) cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "working_link_info.range_value_tq is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "working_link_info.tunnel_id");
        if (cli_parm != NULL)
        {
            val.tunnel_id = (bcmolt_epon_tunnel_id) cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "working_link_info.tunnel_id is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_OPER_PROP_SET(&oper, epon_ni, add_protected_standby_link, working_link_info, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_epon_link_info val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_OPER, BCMOLT_EPON_NI_OPER_ID_ADD_PROTECTED_STANDBY_LINK, BCMOLT_EPON_NI_ADD_PROTECTED_STANDBY_LINK_ID_WORKING_LINK_INFO, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, epon_ni, add_protected_standby_link, working_link_info, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_ni_oper_protection_switching_apply_rerange_delta_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_ni_protection_switching_apply_rerange_delta oper;   /**< declare main API struct */
    bcmolt_epon_ni_key key = { };   /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_ni_protection_switching_apply_rerange_delta oper;\n");
    bcmcli_log("bcmolt_epon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_NI_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, epon_ni, protection_switching_apply_rerange_delta, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, epon_ni, protection_switching_apply_rerange_delta, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "rerange_delta");
    if (cli_parm != NULL)
    {
        uint32_t val;
        val = cli_parm->value.unumber;
        BCMOLT_OPER_PROP_SET(&oper, epon_ni, protection_switching_apply_rerange_delta, rerange_delta, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, epon_ni, protection_switching_apply_rerange_delta, rerange_delta, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_OPER, BCMOLT_EPON_NI_OPER_ID_PROTECTION_SWITCHING_APPLY_RERANGE_DELTA, BCMOLT_EPON_NI_PROTECTION_SWITCHING_APPLY_RERANGE_DELTA_ID_RERANGE_DELTA, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_ni_oper_rogue_llid_scan_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_ni_rogue_llid_scan oper;    /**< declare main API struct */
    bcmolt_epon_ni_key key = { };           /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_ni_rogue_llid_scan oper;\n");
    bcmcli_log("bcmolt_epon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_NI_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, epon_ni, rogue_llid_scan, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, epon_ni, rogue_llid_scan, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "mode");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_OPER_PROP_SET(&oper, epon_ni, rogue_llid_scan, mode, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, epon_ni, rogue_llid_scan, mode, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_OPER, BCMOLT_EPON_NI_OPER_ID_ROGUE_LLID_SCAN, BCMOLT_EPON_NI_ROGUE_LLID_SCAN_ID_MODE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "llid");
    if (cli_parm != NULL)
    {
        bcmolt_epon_llid val;
        val = (bcmolt_epon_llid) cli_parm->value.unumber;
        BCMOLT_OPER_PROP_SET(&oper, epon_ni, rogue_llid_scan, llid, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, epon_ni, rogue_llid_scan, llid, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_OPER, BCMOLT_EPON_NI_OPER_ID_ROGUE_LLID_SCAN, BCMOLT_EPON_NI_ROGUE_LLID_SCAN_ID_LLID, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_ni_oper_start_onu_upgrade_submit(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_ni_start_onu_upgrade oper;  /**< declare main API struct */
    bcmolt_epon_ni_key key = { };           /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_ni_start_onu_upgrade oper;\n");
    bcmcli_log("bcmolt_epon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_NI_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, epon_ni, start_onu_upgrade, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, epon_ni, start_onu_upgrade, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "list_of_onu_ids");
    if (cli_parm != NULL)
    {
        bcmolt_macaddress_list_u32 val = { };
        int32_t i0;
        val.val = apicli_byte_pool_calloc(byte_pool, cli_parm->array_size * sizeof(*val.val));
        if (val.val == NULL)
        {
            apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
            return BCM_ERR_NOMEM;
        }

        val.len = cli_parm->array_size;
        for (i0 = 0; i0 < val.len; i0++)
        {
            val.val[i0] = cli_parm->values[i0].mac;
        }

        BCMOLT_OPER_PROP_SET(&oper, epon_ni, start_onu_upgrade, list_of_onu_ids, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_macaddress_list_u32 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_OPER, BCMOLT_EPON_NI_OPER_ID_START_ONU_UPGRADE, BCMOLT_EPON_NI_START_ONU_UPGRADE_ID_LIST_OF_ONU_IDS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, epon_ni, start_onu_upgrade, list_of_onu_ids, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_ni_auto_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_ni_auto_cfg auto_cfg;   /**< declare main API struct */
    bcmolt_epon_ni_key key = { };       /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_ni_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_epon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_get");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, epon_ni, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, epon_ni, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "auto_rogue_scan_10g_failure");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_ni, auto_rogue_scan_10g_failure);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_ni, auto_rogue_scan_10g_failure);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "auto_rogue_scan_1g_failure");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_ni, auto_rogue_scan_1g_failure);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_ni, auto_rogue_scan_1g_failure);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "llid_quarantined");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_ni, llid_quarantined);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_ni, llid_quarantined);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "mpcp_timestamp_changed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_ni, mpcp_timestamp_changed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_ni, mpcp_timestamp_changed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "no_reports");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_ni, no_reports);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_ni, no_reports);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_upgrade_complete");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_ni, onu_upgrade_complete);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_ni, onu_upgrade_complete);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rerange_failure");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_ni, rerange_failure);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_ni, rerange_failure);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rogue_scan_complete");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_ni, rogue_scan_complete);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_ni, rogue_scan_complete);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rssi_measurement_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_ni, rssi_measurement_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_ni, rssi_measurement_completed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "state_change_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_ni, state_change_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_ni, state_change_completed);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_ni, auto_rogue_scan_10g_failure) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_ni, auto_rogue_scan_1g_failure) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_ni, llid_quarantined) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_ni, mpcp_timestamp_changed) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_ni, no_reports) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_ni, onu_upgrade_complete) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_ni, rerange_failure) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_ni, rogue_scan_complete) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_ni, rssi_measurement_completed) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_ni, state_change_completed))
    {
        BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_ni, all_properties);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_ni, all_properties);\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &auto_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_ni_auto_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_ni_auto_cfg auto_cfg;   /**< declare main API struct */
    bcmolt_epon_ni_key key = { };       /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_ni_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_epon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_set");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, epon_ni, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, epon_ni, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "auto_rogue_scan_10g_failure");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_ni, auto_rogue_scan_10g_failure, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_ni, auto_rogue_scan_10g_failure, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_NI_AUTO_CFG_ID_AUTO_ROGUE_SCAN_10G_FAILURE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "auto_rogue_scan_1g_failure");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_ni, auto_rogue_scan_1g_failure, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_ni, auto_rogue_scan_1g_failure, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_NI_AUTO_CFG_ID_AUTO_ROGUE_SCAN_1G_FAILURE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "llid_quarantined");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_ni, llid_quarantined, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_ni, llid_quarantined, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_NI_AUTO_CFG_ID_LLID_QUARANTINED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "mpcp_timestamp_changed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_ni, mpcp_timestamp_changed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_ni, mpcp_timestamp_changed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_NI_AUTO_CFG_ID_MPCP_TIMESTAMP_CHANGED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "no_reports");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_ni, no_reports, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_ni, no_reports, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_NI_AUTO_CFG_ID_NO_REPORTS, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_upgrade_complete");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_ni, onu_upgrade_complete, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_ni, onu_upgrade_complete, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_NI_AUTO_CFG_ID_ONU_UPGRADE_COMPLETE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rerange_failure");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_ni, rerange_failure, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_ni, rerange_failure, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_NI_AUTO_CFG_ID_RERANGE_FAILURE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rogue_scan_complete");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_ni, rogue_scan_complete, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_ni, rogue_scan_complete, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_NI_AUTO_CFG_ID_ROGUE_SCAN_COMPLETE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rssi_measurement_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_ni, rssi_measurement_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_ni, rssi_measurement_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_NI_AUTO_CFG_ID_RSSI_MEASUREMENT_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "state_change_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_ni, state_change_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_ni, state_change_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_NI_AUTO_CFG_ID_STATE_CHANGE_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);\n");
    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_onu_10g_us_stat_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_onu_10g_us_stat stat;       /**< declare main API struct */
    bcmolt_epon_onu_10g_us_key key = { };   /**< declare key */
    bcmos_bool clear_on_read;               /**< declare 'clear on read' flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_onu_10g_us_stat stat;\n");
    bcmcli_log("bcmolt_epon_onu_10g_us_key key = {  };\n");
    bcmcli_log("bcmos_bool clear_on_read;\n");
    apicli_print_start(session, "bcmolt_stat_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_ONU_10G_US, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_ONU_10G_US_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        key.onu_id = (bcmolt_epon_onu_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "onu_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.onu_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_ONU_10G_US, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_ONU_10G_US_KEY_ID_ONU_ID, &key.onu_id);
    bcmcli_log(";\n");

    /* set stat flags from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "clear");
    if (cli_parm != NULL)
    {
        clear_on_read = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "clear is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("clear_on_read = %s;\n", (clear_on_read) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* init the API struct */
    BCMOLT_STAT_INIT(&stat, epon_onu_10g_us, key);
    bcmcli_log("BCMOLT_STAT_INIT(&stat, epon_onu_10g_us, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "fec_code_words_total");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_onu_10g_us, fec_code_words_total);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_onu_10g_us, fec_code_words_total);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "fec_code_words_decode_fails");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_onu_10g_us, fec_code_words_decode_fails);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_onu_10g_us, fec_code_words_decode_fails);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "fec_zeroes_corrected");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_onu_10g_us, fec_zeroes_corrected);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_onu_10g_us, fec_zeroes_corrected);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "fec_ones_corrected");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_onu_10g_us, fec_ones_corrected);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_onu_10g_us, fec_ones_corrected);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_STAT_PROP_IS_SET(&stat, epon_onu_10g_us, fec_code_words_total) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_onu_10g_us, fec_code_words_decode_fails) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_onu_10g_us, fec_zeroes_corrected) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_onu_10g_us, fec_ones_corrected))
    {
        BCMOLT_STAT_PROP_GET(&stat, epon_onu_10g_us, all_properties);
        bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_onu_10g_us, all_properties);\n");
    }

    /* call API */
    err = bcmolt_stat_get(device_id, &stat.hdr, clear_on_read);
    bcmcli_log("bcmolt_stat_get(device_id, &stat.hdr, clear_on_read);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &stat.hdr.hdr);
    }

    apicli_print_complete(session, err, stat.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_onu_10g_us_cfg_get(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_onu_10g_us_cfg cfg;         /**< declare main API struct */
    bcmolt_epon_onu_10g_us_key key = { };   /**< declare key */
    uint8_t *list_mem;                      /**< declare memory buffer for variable-sized lists */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_onu_10g_us_cfg cfg;\n");
    bcmcli_log("bcmolt_epon_onu_10g_us_key key = {  };\n");
    bcmcli_log("uint8_t* list_mem;\n");
    apicli_print_start(session, "bcmolt_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_ONU_10G_US, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_ONU_10G_US_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        key.onu_id = (bcmolt_epon_onu_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "onu_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.onu_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_ONU_10G_US, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_ONU_10G_US_KEY_ID_ONU_ID, &key.onu_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, epon_onu_10g_us, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, epon_onu_10g_us, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "all_links");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_onu_10g_us, all_links);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_onu_10g_us, all_links);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_CFG_PROP_IS_SET(&cfg, epon_onu_10g_us, all_links))
    {
        BCMOLT_CFG_PROP_GET(&cfg, epon_onu_10g_us, all_properties);
        bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_onu_10g_us, all_properties);\n");
    }

    /* set memory to use for variable-sized lists */
    list_mem = apicli_byte_pool_calloc(byte_pool, APICLI_DYNAMIC_LIST_BUFFER_SIZE);
    if (list_mem == NULL)
    {
        apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
        return BCM_ERR_NOMEM;
    }

    bcmcli_log("list_mem = bcmos_calloc(APICLI_DYNAMIC_LIST_BUFFER_SIZE);\n");
    BCMOLT_CFG_LIST_BUF_SET(&cfg, epon_onu_10g_us, list_mem, APICLI_DYNAMIC_LIST_BUFFER_SIZE);
    bcmcli_log("BCMOLT_CFG_LIST_BUF_SET(&cfg, epon_onu_10g_us, list_mem, APICLI_DYNAMIC_LIST_BUFFER_SIZE);\n");

    /* call API */
    err = bcmolt_cfg_get(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_get(device_id, &cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_onu_10g_us_cfg_set(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_onu_10g_us_cfg cfg;         /**< declare main API struct */
    bcmolt_epon_onu_10g_us_key key = { };   /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_onu_10g_us_cfg cfg;\n");
    bcmcli_log("bcmolt_epon_onu_10g_us_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_ONU_10G_US, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_ONU_10G_US_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        key.onu_id = (bcmolt_epon_onu_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "onu_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.onu_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_ONU_10G_US, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_ONU_10G_US_KEY_ID_ONU_ID, &key.onu_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, epon_onu_10g_us, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, epon_onu_10g_us, key);\n");

    /* decode API parameters from CLI */

    /* call API */
    err = bcmolt_cfg_set(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_set(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_onu_10g_us_cfg_clear(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_onu_10g_us_cfg cfg;         /**< declare main API struct */
    bcmolt_epon_onu_10g_us_key key = { };   /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_onu_10g_us_cfg cfg;\n");
    bcmcli_log("bcmolt_epon_onu_10g_us_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_clear");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_ONU_10G_US, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_ONU_10G_US_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        key.onu_id = (bcmolt_epon_onu_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "onu_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.onu_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_ONU_10G_US, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_ONU_10G_US_KEY_ID_ONU_ID, &key.onu_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, epon_onu_10g_us, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, epon_onu_10g_us, key);\n");

    /* call API */
    err = bcmolt_cfg_clear(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_clear(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_onu_10g_us_cfg_get_multi(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_onu_10g_us_cfg cfg;         /**< declare main API struct */
    bcmolt_epon_onu_10g_us_key key = { };   /**< declare key */
    bcmolt_msg_set *msg_set = NULL;         /**< declare message set */
    uint32_t max_msgs;                      /**< declare max number of msgs to get */
    bcmos_bool invert_filter;               /**< declare filter invert flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_onu_10g_us_cfg cfg;\n");
    bcmcli_log("bcmolt_epon_onu_10g_us_key key = {  };\n");
    bcmcli_log("bcmolt_msg_set* msg_set = NULL;\n");
    bcmcli_log("uint32_t max_msgs;\n");
    bcmcli_log("bcmos_bool invert_filter;\n");
    apicli_print_start(session, "bcmolt_cfg_get_multi");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_ONU_10G_US, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_ONU_10G_US_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        key.onu_id = (bcmolt_epon_onu_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "onu_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.onu_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_ONU_10G_US, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_ONU_10G_US_KEY_ID_ONU_ID, &key.onu_id);
    bcmcli_log(";\n");

    /* set max number of msgs from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "max_msgs");
    if (cli_parm != NULL)
    {
        max_msgs = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "max_msgs is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("max_msgs = %d;\n", max_msgs);

    /* set filter invert flag from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "filter_invert");
    if (cli_parm != NULL)
    {
        invert_filter = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "filter_invert is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("invert_filter = %s;\n", (invert_filter) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* allocate message set */
    err = apicli_msg_set_alloc(byte_pool, BCMOLT_OBJ_ID_EPON_ONU_10G_US, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);
    if (err != BCM_ERR_OK)
    {
        return err;
    }

    bcmcli_log("bcmolt_msg_set_alloc(BCMOLT_OBJ_ID_EPON_ONU_10G_US, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, epon_onu_10g_us, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, epon_onu_10g_us, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "filter.all_links");
    if (cli_parm != NULL)
    {
        bcmolt_macaddress_list_u32_max_2048 val = { };
        int32_t i0;
        val.val = apicli_byte_pool_calloc(byte_pool, cli_parm->array_size * sizeof(*val.val));
        if (val.val == NULL)
        {
            apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
            return BCM_ERR_NOMEM;
        }

        val.len = cli_parm->array_size;
        for (i0 = 0; i0 < val.len; i0++)
        {
            val.val[i0] = cli_parm->values[i0].mac;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_onu_10g_us, all_links, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_macaddress_list_u32_max_2048 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_ONU_10G_US, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_ONU_10G_US_CFG_ID_ALL_LINKS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_onu_10g_us, all_links, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "all_links");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_onu_10g_us, all_links);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_onu_10g_us, all_links);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_onu_10g_us, all_links))
    {
        BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_onu_10g_us, all_properties);
        bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_onu_10g_us, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);
    bcmcli_log("bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_onu_10g_us_stat_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_onu_10g_us_stat_cfg stat_cfg;   /**< declare main API struct */
    bcmolt_epon_onu_10g_us_key key = { };       /**< declare key */
    bcmolt_epon_onu_10g_us_stat_id stat_id;     /**< declare stat ID */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_onu_10g_us_stat_cfg stat_cfg;\n");
    bcmcli_log("bcmolt_epon_onu_10g_us_key key = {  };\n");
    apicli_print_start(session, "bcmolt_stat_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_ONU_10G_US, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_ONU_10G_US_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        key.onu_id = (bcmolt_epon_onu_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "onu_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.onu_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_ONU_10G_US, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_ONU_10G_US_KEY_ID_ONU_ID, &key.onu_id);
    bcmcli_log(";\n");

    /* set stat ID from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "sub");
    if (cli_parm != NULL)
    {
        stat_id = (bcmolt_epon_onu_10g_us_stat_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
        return BCM_ERR_PARM;
    }

    /* init the API struct */
    switch (stat_id)
    {
        case BCMOLT_EPON_ONU_10G_US_STAT_ID_FEC_CODE_WORDS_TOTAL:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_10g_us, fec_code_words_total, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_10g_us, fec_code_words_total, key);\n");
            break;
        case BCMOLT_EPON_ONU_10G_US_STAT_ID_FEC_CODE_WORDS_DECODE_FAILS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_10g_us, fec_code_words_decode_fails, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_10g_us, fec_code_words_decode_fails, key);\n");
            break;
        case BCMOLT_EPON_ONU_10G_US_STAT_ID_FEC_ZEROES_CORRECTED:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_10g_us, fec_zeroes_corrected, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_10g_us, fec_zeroes_corrected, key);\n");
            break;
        case BCMOLT_EPON_ONU_10G_US_STAT_ID_FEC_ONES_CORRECTED:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_10g_us, fec_ones_corrected, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_10g_us, fec_ones_corrected, key);\n");
            break;
        default:
            apicli_print_complete(session, BCM_ERR_RANGE, "\n");
            return BCM_ERR_RANGE;
    }

    /* call API */
    err = bcmolt_stat_cfg_get(device_id, &stat_cfg.hdr);
    bcmcli_log("bcmolt_stat_cfg_get(device_id, &stat_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &stat_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, stat_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_onu_10g_us_stat_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_onu_10g_us_stat_cfg stat_cfg;   /**< declare main API struct */
    bcmolt_epon_onu_10g_us_key key = { };       /**< declare key */
    bcmolt_epon_onu_10g_us_stat_id stat_id;     /**< declare stat ID */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_onu_10g_us_stat_cfg stat_cfg;\n");
    bcmcli_log("bcmolt_epon_onu_10g_us_key key = {  };\n");
    apicli_print_start(session, "bcmolt_stat_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_ONU_10G_US, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_ONU_10G_US_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        key.onu_id = (bcmolt_epon_onu_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "onu_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.onu_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_ONU_10G_US, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_ONU_10G_US_KEY_ID_ONU_ID, &key.onu_id);
    bcmcli_log(";\n");

    /* set stat ID from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "sub");
    if (cli_parm != NULL)
    {
        stat_id = (bcmolt_epon_onu_10g_us_stat_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
        return BCM_ERR_PARM;
    }

    /* init the API struct */
    switch (stat_id)
    {
        case BCMOLT_EPON_ONU_10G_US_STAT_ID_FEC_CODE_WORDS_TOTAL:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_10g_us, fec_code_words_total, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_10g_us, fec_code_words_total, key);\n");
            break;
        case BCMOLT_EPON_ONU_10G_US_STAT_ID_FEC_CODE_WORDS_DECODE_FAILS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_10g_us, fec_code_words_decode_fails, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_10g_us, fec_code_words_decode_fails, key);\n");
            break;
        case BCMOLT_EPON_ONU_10G_US_STAT_ID_FEC_ZEROES_CORRECTED:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_10g_us, fec_zeroes_corrected, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_10g_us, fec_zeroes_corrected, key);\n");
            break;
        case BCMOLT_EPON_ONU_10G_US_STAT_ID_FEC_ONES_CORRECTED:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_10g_us, fec_ones_corrected, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_10g_us, fec_ones_corrected, key);\n");
            break;
        default:
            apicli_print_complete(session, BCM_ERR_RANGE, "\n");
            return BCM_ERR_RANGE;
    }

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.");
    if (cli_parm != NULL)
    {
        bcmolt_stat_alarm_config val = { };
        cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.trigger.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.type");
            if (cli_parm != NULL)
            {
                val.trigger.type = (bcmolt_stat_condition_type) cli_parm->value.enum_val;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.type is not set\n");
                return BCM_ERR_PARM;
            }

            switch (val.trigger.type)
            {
                case BCMOLT_STAT_CONDITION_TYPE_RATE_THRESHOLD:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.rising");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_threshold.rising = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.rising is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.falling");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_threshold.falling = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.falling is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_RATE_RANGE:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.upper");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_range.upper = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.upper is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.lower");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_range.lower = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.lower is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_VALUE_THRESHOLD:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.limit");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.value_threshold.limit = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.limit is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_NONE:
                    break;
                default:
                    apicli_print_complete(session, BCM_ERR_RANGE, "\n");
                    return BCM_ERR_RANGE;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.soak.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "cfg.soak.active_soak_time");
            if (cli_parm != NULL)
            {
                val.soak.active_soak_time = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak.active_soak_time is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "cfg.soak.clear_soak_time");
            if (cli_parm != NULL)
            {
                val.soak.clear_soak_time = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak.clear_soak_time is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_STAT_CFG_PROP_SET(&stat_cfg, epon_onu_10g_us, cfg, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_stat_alarm_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_ONU_10G_US, BCMOLT_MGT_GROUP_STAT_CFG, 0, BCMOLT_EPON_ONU_10G_US_STAT_CFG_ID_CFG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_STAT_CFG_PROP_SET(&stat_cfg, epon_onu_10g_us, cfg, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_stat_cfg_set(device_id, &stat_cfg.hdr);
    bcmcli_log("bcmolt_stat_cfg_set(device_id, &stat_cfg.hdr);\n");
    apicli_print_complete(session, err, stat_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_onu_10g_us_auto_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_onu_10g_us_auto_cfg auto_cfg;   /**< declare main API struct */
    bcmolt_epon_onu_10g_us_key key = { };       /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_onu_10g_us_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_epon_onu_10g_us_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_get");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, epon_onu_10g_us, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, epon_onu_10g_us, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_cleared");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_onu_10g_us, stat_alarm_cleared);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_onu_10g_us, stat_alarm_cleared);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_raised");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_onu_10g_us, stat_alarm_raised);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_onu_10g_us, stat_alarm_raised);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_onu_10g_us, stat_alarm_cleared) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_onu_10g_us, stat_alarm_raised))
    {
        BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_onu_10g_us, all_properties);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_onu_10g_us, all_properties);\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &auto_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_onu_10g_us_auto_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_onu_10g_us_auto_cfg auto_cfg;   /**< declare main API struct */
    bcmolt_epon_onu_10g_us_key key = { };       /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_onu_10g_us_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_epon_onu_10g_us_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_set");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, epon_onu_10g_us, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, epon_onu_10g_us, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_cleared");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_onu_10g_us, stat_alarm_cleared, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_onu_10g_us, stat_alarm_cleared, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_ONU_10G_US, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_ONU_10G_US_AUTO_CFG_ID_STAT_ALARM_CLEARED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_raised");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_onu_10g_us, stat_alarm_raised, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_onu_10g_us, stat_alarm_raised, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_ONU_10G_US, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_ONU_10G_US_AUTO_CFG_ID_STAT_ALARM_RAISED, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);\n");
    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_onu_1g_us_stat_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_onu_1g_us_stat stat;        /**< declare main API struct */
    bcmolt_epon_onu_1g_us_key key = { };    /**< declare key */
    bcmos_bool clear_on_read;               /**< declare 'clear on read' flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_onu_1g_us_stat stat;\n");
    bcmcli_log("bcmolt_epon_onu_1g_us_key key = {  };\n");
    bcmcli_log("bcmos_bool clear_on_read;\n");
    apicli_print_start(session, "bcmolt_stat_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_ONU_1G_US, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_ONU_1G_US_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        key.onu_id = (bcmolt_epon_onu_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "onu_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.onu_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_ONU_1G_US, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_ONU_1G_US_KEY_ID_ONU_ID, &key.onu_id);
    bcmcli_log(";\n");

    /* set stat flags from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "clear");
    if (cli_parm != NULL)
    {
        clear_on_read = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "clear is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("clear_on_read = %s;\n", (clear_on_read) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* init the API struct */
    BCMOLT_STAT_INIT(&stat, epon_onu_1g_us, key);
    bcmcli_log("BCMOLT_STAT_INIT(&stat, epon_onu_1g_us, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "good_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_onu_1g_us, good_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_onu_1g_us, good_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "good_bytes");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_onu_1g_us, good_bytes);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_onu_1g_us, good_bytes);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "oversz_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_onu_1g_us, oversz_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_onu_1g_us, oversz_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "non_fec_good_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_onu_1g_us, non_fec_good_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_onu_1g_us, non_fec_good_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "non_fec_good_bytes");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_onu_1g_us, non_fec_good_bytes);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_onu_1g_us, non_fec_good_bytes);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "fec_good_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_onu_1g_us, fec_good_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_onu_1g_us, fec_good_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "fec_good_bytes");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_onu_1g_us, fec_good_bytes);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_onu_1g_us, fec_good_bytes);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "fec_frames_exc_errs");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_onu_1g_us, fec_frames_exc_errs);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_onu_1g_us, fec_frames_exc_errs);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "fec_blks_no_errs");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_onu_1g_us, fec_blks_no_errs);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_onu_1g_us, fec_blks_no_errs);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "fec_blks_corr_errs");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_onu_1g_us, fec_blks_corr_errs);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_onu_1g_us, fec_blks_corr_errs);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "fec_blks_uncorr_errs");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_onu_1g_us, fec_blks_uncorr_errs);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_onu_1g_us, fec_blks_uncorr_errs);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "fec_corr_bytes");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_onu_1g_us, fec_corr_bytes);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_onu_1g_us, fec_corr_bytes);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "fec_corr_zeroes");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_onu_1g_us, fec_corr_zeroes);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_onu_1g_us, fec_corr_zeroes);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "fec_corr_ones");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_onu_1g_us, fec_corr_ones);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_onu_1g_us, fec_corr_ones);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "undersz_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_onu_1g_us, undersz_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_onu_1g_us, undersz_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "errorsz_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_onu_1g_us, errorsz_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_onu_1g_us, errorsz_frames);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_STAT_PROP_IS_SET(&stat, epon_onu_1g_us, good_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_onu_1g_us, good_bytes) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_onu_1g_us, oversz_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_onu_1g_us, non_fec_good_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_onu_1g_us, non_fec_good_bytes) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_onu_1g_us, fec_good_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_onu_1g_us, fec_good_bytes) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_onu_1g_us, fec_frames_exc_errs) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_onu_1g_us, fec_blks_no_errs) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_onu_1g_us, fec_blks_corr_errs) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_onu_1g_us, fec_blks_uncorr_errs) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_onu_1g_us, fec_corr_bytes) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_onu_1g_us, fec_corr_zeroes) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_onu_1g_us, fec_corr_ones) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_onu_1g_us, undersz_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_onu_1g_us, errorsz_frames))
    {
        BCMOLT_STAT_PROP_GET(&stat, epon_onu_1g_us, all_properties);
        bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_onu_1g_us, all_properties);\n");
    }

    /* call API */
    err = bcmolt_stat_get(device_id, &stat.hdr, clear_on_read);
    bcmcli_log("bcmolt_stat_get(device_id, &stat.hdr, clear_on_read);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &stat.hdr.hdr);
    }

    apicli_print_complete(session, err, stat.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_onu_1g_us_cfg_get(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_onu_1g_us_cfg cfg;          /**< declare main API struct */
    bcmolt_epon_onu_1g_us_key key = { };    /**< declare key */
    uint8_t *list_mem;                      /**< declare memory buffer for variable-sized lists */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_onu_1g_us_cfg cfg;\n");
    bcmcli_log("bcmolt_epon_onu_1g_us_key key = {  };\n");
    bcmcli_log("uint8_t* list_mem;\n");
    apicli_print_start(session, "bcmolt_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_ONU_1G_US, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_ONU_1G_US_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        key.onu_id = (bcmolt_epon_onu_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "onu_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.onu_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_ONU_1G_US, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_ONU_1G_US_KEY_ID_ONU_ID, &key.onu_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, epon_onu_1g_us, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, epon_onu_1g_us, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "all_links");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_onu_1g_us, all_links);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_onu_1g_us, all_links);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_CFG_PROP_IS_SET(&cfg, epon_onu_1g_us, all_links))
    {
        BCMOLT_CFG_PROP_GET(&cfg, epon_onu_1g_us, all_properties);
        bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_onu_1g_us, all_properties);\n");
    }

    /* set memory to use for variable-sized lists */
    list_mem = apicli_byte_pool_calloc(byte_pool, APICLI_DYNAMIC_LIST_BUFFER_SIZE);
    if (list_mem == NULL)
    {
        apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
        return BCM_ERR_NOMEM;
    }

    bcmcli_log("list_mem = bcmos_calloc(APICLI_DYNAMIC_LIST_BUFFER_SIZE);\n");
    BCMOLT_CFG_LIST_BUF_SET(&cfg, epon_onu_1g_us, list_mem, APICLI_DYNAMIC_LIST_BUFFER_SIZE);
    bcmcli_log("BCMOLT_CFG_LIST_BUF_SET(&cfg, epon_onu_1g_us, list_mem, APICLI_DYNAMIC_LIST_BUFFER_SIZE);\n");

    /* call API */
    err = bcmolt_cfg_get(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_get(device_id, &cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_onu_1g_us_cfg_set(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_onu_1g_us_cfg cfg;          /**< declare main API struct */
    bcmolt_epon_onu_1g_us_key key = { };    /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_onu_1g_us_cfg cfg;\n");
    bcmcli_log("bcmolt_epon_onu_1g_us_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_ONU_1G_US, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_ONU_1G_US_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        key.onu_id = (bcmolt_epon_onu_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "onu_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.onu_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_ONU_1G_US, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_ONU_1G_US_KEY_ID_ONU_ID, &key.onu_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, epon_onu_1g_us, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, epon_onu_1g_us, key);\n");

    /* decode API parameters from CLI */

    /* call API */
    err = bcmolt_cfg_set(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_set(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_onu_1g_us_cfg_clear(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_onu_1g_us_cfg cfg;          /**< declare main API struct */
    bcmolt_epon_onu_1g_us_key key = { };    /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_onu_1g_us_cfg cfg;\n");
    bcmcli_log("bcmolt_epon_onu_1g_us_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_clear");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_ONU_1G_US, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_ONU_1G_US_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        key.onu_id = (bcmolt_epon_onu_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "onu_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.onu_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_ONU_1G_US, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_ONU_1G_US_KEY_ID_ONU_ID, &key.onu_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, epon_onu_1g_us, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, epon_onu_1g_us, key);\n");

    /* call API */
    err = bcmolt_cfg_clear(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_clear(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_onu_1g_us_cfg_get_multi(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_onu_1g_us_cfg cfg;          /**< declare main API struct */
    bcmolt_epon_onu_1g_us_key key = { };    /**< declare key */
    bcmolt_msg_set *msg_set = NULL;         /**< declare message set */
    uint32_t max_msgs;                      /**< declare max number of msgs to get */
    bcmos_bool invert_filter;               /**< declare filter invert flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_onu_1g_us_cfg cfg;\n");
    bcmcli_log("bcmolt_epon_onu_1g_us_key key = {  };\n");
    bcmcli_log("bcmolt_msg_set* msg_set = NULL;\n");
    bcmcli_log("uint32_t max_msgs;\n");
    bcmcli_log("bcmos_bool invert_filter;\n");
    apicli_print_start(session, "bcmolt_cfg_get_multi");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_ONU_1G_US, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_ONU_1G_US_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        key.onu_id = (bcmolt_epon_onu_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "onu_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.onu_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_ONU_1G_US, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_ONU_1G_US_KEY_ID_ONU_ID, &key.onu_id);
    bcmcli_log(";\n");

    /* set max number of msgs from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "max_msgs");
    if (cli_parm != NULL)
    {
        max_msgs = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "max_msgs is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("max_msgs = %d;\n", max_msgs);

    /* set filter invert flag from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "filter_invert");
    if (cli_parm != NULL)
    {
        invert_filter = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "filter_invert is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("invert_filter = %s;\n", (invert_filter) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* allocate message set */
    err = apicli_msg_set_alloc(byte_pool, BCMOLT_OBJ_ID_EPON_ONU_1G_US, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);
    if (err != BCM_ERR_OK)
    {
        return err;
    }

    bcmcli_log("bcmolt_msg_set_alloc(BCMOLT_OBJ_ID_EPON_ONU_1G_US, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, epon_onu_1g_us, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, epon_onu_1g_us, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "filter.all_links");
    if (cli_parm != NULL)
    {
        bcmolt_macaddress_list_u32 val = { };
        int32_t i0;
        val.val = apicli_byte_pool_calloc(byte_pool, cli_parm->array_size * sizeof(*val.val));
        if (val.val == NULL)
        {
            apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
            return BCM_ERR_NOMEM;
        }

        val.len = cli_parm->array_size;
        for (i0 = 0; i0 < val.len; i0++)
        {
            val.val[i0] = cli_parm->values[i0].mac;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_onu_1g_us, all_links, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_macaddress_list_u32 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_ONU_1G_US, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_ONU_1G_US_CFG_ID_ALL_LINKS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_onu_1g_us, all_links, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "all_links");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_onu_1g_us, all_links);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_onu_1g_us, all_links);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_onu_1g_us, all_links))
    {
        BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_onu_1g_us, all_properties);
        bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_onu_1g_us, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);
    bcmcli_log("bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_onu_1g_us_stat_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_onu_1g_us_stat_cfg stat_cfg;    /**< declare main API struct */
    bcmolt_epon_onu_1g_us_key key = { };        /**< declare key */
    bcmolt_epon_onu_1g_us_stat_id stat_id;      /**< declare stat ID */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_onu_1g_us_stat_cfg stat_cfg;\n");
    bcmcli_log("bcmolt_epon_onu_1g_us_key key = {  };\n");
    apicli_print_start(session, "bcmolt_stat_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_ONU_1G_US, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_ONU_1G_US_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        key.onu_id = (bcmolt_epon_onu_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "onu_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.onu_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_ONU_1G_US, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_ONU_1G_US_KEY_ID_ONU_ID, &key.onu_id);
    bcmcli_log(";\n");

    /* set stat ID from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "sub");
    if (cli_parm != NULL)
    {
        stat_id = (bcmolt_epon_onu_1g_us_stat_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
        return BCM_ERR_PARM;
    }

    /* init the API struct */
    switch (stat_id)
    {
        case BCMOLT_EPON_ONU_1G_US_STAT_ID_GOOD_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, good_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, good_frames, key);\n");
            break;
        case BCMOLT_EPON_ONU_1G_US_STAT_ID_GOOD_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, good_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, good_bytes, key);\n");
            break;
        case BCMOLT_EPON_ONU_1G_US_STAT_ID_OVERSZ_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, oversz_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, oversz_frames, key);\n");
            break;
        case BCMOLT_EPON_ONU_1G_US_STAT_ID_NON_FEC_GOOD_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, non_fec_good_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, non_fec_good_frames, key);\n");
            break;
        case BCMOLT_EPON_ONU_1G_US_STAT_ID_NON_FEC_GOOD_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, non_fec_good_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, non_fec_good_bytes, key);\n");
            break;
        case BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_GOOD_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, fec_good_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, fec_good_frames, key);\n");
            break;
        case BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_GOOD_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, fec_good_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, fec_good_bytes, key);\n");
            break;
        case BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_FRAMES_EXC_ERRS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, fec_frames_exc_errs, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, fec_frames_exc_errs, key);\n");
            break;
        case BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_BLKS_NO_ERRS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, fec_blks_no_errs, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, fec_blks_no_errs, key);\n");
            break;
        case BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_BLKS_CORR_ERRS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, fec_blks_corr_errs, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, fec_blks_corr_errs, key);\n");
            break;
        case BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_BLKS_UNCORR_ERRS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, fec_blks_uncorr_errs, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, fec_blks_uncorr_errs, key);\n");
            break;
        case BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_CORR_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, fec_corr_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, fec_corr_bytes, key);\n");
            break;
        case BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_CORR_ZEROES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, fec_corr_zeroes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, fec_corr_zeroes, key);\n");
            break;
        case BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_CORR_ONES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, fec_corr_ones, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, fec_corr_ones, key);\n");
            break;
        case BCMOLT_EPON_ONU_1G_US_STAT_ID_UNDERSZ_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, undersz_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, undersz_frames, key);\n");
            break;
        case BCMOLT_EPON_ONU_1G_US_STAT_ID_ERRORSZ_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, errorsz_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, errorsz_frames, key);\n");
            break;
        default:
            apicli_print_complete(session, BCM_ERR_RANGE, "\n");
            return BCM_ERR_RANGE;
    }

    /* call API */
    err = bcmolt_stat_cfg_get(device_id, &stat_cfg.hdr);
    bcmcli_log("bcmolt_stat_cfg_get(device_id, &stat_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &stat_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, stat_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_onu_1g_us_stat_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_onu_1g_us_stat_cfg stat_cfg;    /**< declare main API struct */
    bcmolt_epon_onu_1g_us_key key = { };        /**< declare key */
    bcmolt_epon_onu_1g_us_stat_id stat_id;      /**< declare stat ID */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_onu_1g_us_stat_cfg stat_cfg;\n");
    bcmcli_log("bcmolt_epon_onu_1g_us_key key = {  };\n");
    apicli_print_start(session, "bcmolt_stat_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_ONU_1G_US, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_ONU_1G_US_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        key.onu_id = (bcmolt_epon_onu_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "onu_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.onu_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_ONU_1G_US, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_ONU_1G_US_KEY_ID_ONU_ID, &key.onu_id);
    bcmcli_log(";\n");

    /* set stat ID from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "sub");
    if (cli_parm != NULL)
    {
        stat_id = (bcmolt_epon_onu_1g_us_stat_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
        return BCM_ERR_PARM;
    }

    /* init the API struct */
    switch (stat_id)
    {
        case BCMOLT_EPON_ONU_1G_US_STAT_ID_GOOD_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, good_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, good_frames, key);\n");
            break;
        case BCMOLT_EPON_ONU_1G_US_STAT_ID_GOOD_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, good_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, good_bytes, key);\n");
            break;
        case BCMOLT_EPON_ONU_1G_US_STAT_ID_OVERSZ_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, oversz_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, oversz_frames, key);\n");
            break;
        case BCMOLT_EPON_ONU_1G_US_STAT_ID_NON_FEC_GOOD_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, non_fec_good_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, non_fec_good_frames, key);\n");
            break;
        case BCMOLT_EPON_ONU_1G_US_STAT_ID_NON_FEC_GOOD_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, non_fec_good_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, non_fec_good_bytes, key);\n");
            break;
        case BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_GOOD_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, fec_good_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, fec_good_frames, key);\n");
            break;
        case BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_GOOD_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, fec_good_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, fec_good_bytes, key);\n");
            break;
        case BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_FRAMES_EXC_ERRS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, fec_frames_exc_errs, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, fec_frames_exc_errs, key);\n");
            break;
        case BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_BLKS_NO_ERRS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, fec_blks_no_errs, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, fec_blks_no_errs, key);\n");
            break;
        case BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_BLKS_CORR_ERRS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, fec_blks_corr_errs, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, fec_blks_corr_errs, key);\n");
            break;
        case BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_BLKS_UNCORR_ERRS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, fec_blks_uncorr_errs, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, fec_blks_uncorr_errs, key);\n");
            break;
        case BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_CORR_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, fec_corr_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, fec_corr_bytes, key);\n");
            break;
        case BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_CORR_ZEROES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, fec_corr_zeroes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, fec_corr_zeroes, key);\n");
            break;
        case BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_CORR_ONES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, fec_corr_ones, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, fec_corr_ones, key);\n");
            break;
        case BCMOLT_EPON_ONU_1G_US_STAT_ID_UNDERSZ_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, undersz_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, undersz_frames, key);\n");
            break;
        case BCMOLT_EPON_ONU_1G_US_STAT_ID_ERRORSZ_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, errorsz_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_onu_1g_us, errorsz_frames, key);\n");
            break;
        default:
            apicli_print_complete(session, BCM_ERR_RANGE, "\n");
            return BCM_ERR_RANGE;
    }

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.");
    if (cli_parm != NULL)
    {
        bcmolt_stat_alarm_config val = { };
        cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.trigger.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.type");
            if (cli_parm != NULL)
            {
                val.trigger.type = (bcmolt_stat_condition_type) cli_parm->value.enum_val;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.type is not set\n");
                return BCM_ERR_PARM;
            }

            switch (val.trigger.type)
            {
                case BCMOLT_STAT_CONDITION_TYPE_RATE_THRESHOLD:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.rising");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_threshold.rising = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.rising is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.falling");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_threshold.falling = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.falling is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_RATE_RANGE:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.upper");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_range.upper = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.upper is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.lower");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_range.lower = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.lower is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_VALUE_THRESHOLD:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.limit");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.value_threshold.limit = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.limit is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_NONE:
                    break;
                default:
                    apicli_print_complete(session, BCM_ERR_RANGE, "\n");
                    return BCM_ERR_RANGE;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.soak.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "cfg.soak.active_soak_time");
            if (cli_parm != NULL)
            {
                val.soak.active_soak_time = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak.active_soak_time is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "cfg.soak.clear_soak_time");
            if (cli_parm != NULL)
            {
                val.soak.clear_soak_time = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak.clear_soak_time is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_STAT_CFG_PROP_SET(&stat_cfg, epon_onu_1g_us, cfg, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_stat_alarm_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_ONU_1G_US, BCMOLT_MGT_GROUP_STAT_CFG, 0, BCMOLT_EPON_ONU_1G_US_STAT_CFG_ID_CFG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_STAT_CFG_PROP_SET(&stat_cfg, epon_onu_1g_us, cfg, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_stat_cfg_set(device_id, &stat_cfg.hdr);
    bcmcli_log("bcmolt_stat_cfg_set(device_id, &stat_cfg.hdr);\n");
    apicli_print_complete(session, err, stat_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_onu_1g_us_auto_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_onu_1g_us_auto_cfg auto_cfg;    /**< declare main API struct */
    bcmolt_epon_onu_1g_us_key key = { };        /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_onu_1g_us_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_epon_onu_1g_us_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_get");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, epon_onu_1g_us, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, epon_onu_1g_us, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_cleared");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_onu_1g_us, stat_alarm_cleared);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_onu_1g_us, stat_alarm_cleared);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_raised");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_onu_1g_us, stat_alarm_raised);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_onu_1g_us, stat_alarm_raised);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_onu_1g_us, stat_alarm_cleared) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_onu_1g_us, stat_alarm_raised))
    {
        BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_onu_1g_us, all_properties);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_onu_1g_us, all_properties);\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &auto_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_onu_1g_us_auto_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_onu_1g_us_auto_cfg auto_cfg;    /**< declare main API struct */
    bcmolt_epon_onu_1g_us_key key = { };        /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_onu_1g_us_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_epon_onu_1g_us_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_set");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, epon_onu_1g_us, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, epon_onu_1g_us, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_cleared");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_onu_1g_us, stat_alarm_cleared, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_onu_1g_us, stat_alarm_cleared, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_ONU_1G_US, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_ONU_1G_US_AUTO_CFG_ID_STAT_ALARM_CLEARED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_raised");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_onu_1g_us, stat_alarm_raised, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_onu_1g_us, stat_alarm_raised, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_ONU_1G_US, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_ONU_1G_US_AUTO_CFG_ID_STAT_ALARM_RAISED, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);\n");
    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_path_10g_ds_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_path_10g_ds_cfg cfg;        /**< declare main API struct */
    bcmolt_epon_path_10g_ds_key key = { };  /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_path_10g_ds_cfg cfg;\n");
    bcmcli_log("bcmolt_epon_path_10g_ds_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_10G_DS, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_PATH_10G_DS_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, epon_path_10g_ds, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, epon_path_10g_ds, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "fec_state");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_path_10g_ds, fec_state);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_path_10g_ds, fec_state);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "prbs_generator");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_path_10g_ds, prbs_generator);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_path_10g_ds, prbs_generator);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_CFG_PROP_IS_SET(&cfg, epon_path_10g_ds, fec_state) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_path_10g_ds, prbs_generator))
    {
        BCMOLT_CFG_PROP_GET(&cfg, epon_path_10g_ds, all_properties);
        bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_path_10g_ds, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_get(device_id, &cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_path_10g_ds_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_path_10g_ds_cfg cfg;        /**< declare main API struct */
    bcmolt_epon_path_10g_ds_key key = { };  /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_path_10g_ds_cfg cfg;\n");
    bcmcli_log("bcmolt_epon_path_10g_ds_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_10G_DS, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_PATH_10G_DS_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, epon_path_10g_ds, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, epon_path_10g_ds, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "fec_state");
    if (cli_parm != NULL)
    {
        bcmolt_epon_fec_en_state val;
        val = (bcmolt_epon_fec_en_state) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, epon_path_10g_ds, fec_state, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_path_10g_ds, fec_state, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_10G_DS, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_PATH_10G_DS_CFG_ID_FEC_STATE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "prbs_generator.");
    if (cli_parm != NULL)
    {
        bcmolt_prbs_generator_config val = { };
        cli_parm = bcmcli_find_named_parm(session, "prbs_generator.polynom");
        if (cli_parm != NULL)
        {
            val.polynom = (bcmolt_prbs_polynomial) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "prbs_generator.polynom is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "prbs_generator.error_insert");
        if (cli_parm != NULL)
        {
            val.error_insert = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "prbs_generator.error_insert is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "prbs_generator.invert");
        if (cli_parm != NULL)
        {
            val.invert = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "prbs_generator.invert is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "prbs_generator.control");
        if (cli_parm != NULL)
        {
            val.control = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "prbs_generator.control is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_path_10g_ds, prbs_generator, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_prbs_generator_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_10G_DS, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_PATH_10G_DS_CFG_ID_PRBS_GENERATOR, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_path_10g_ds, prbs_generator, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_cfg_set(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_set(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_path_10g_ds_cfg_clear(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_path_10g_ds_cfg cfg;        /**< declare main API struct */
    bcmolt_epon_path_10g_ds_key key = { };  /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_path_10g_ds_cfg cfg;\n");
    bcmcli_log("bcmolt_epon_path_10g_ds_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_clear");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_10G_DS, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_PATH_10G_DS_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, epon_path_10g_ds, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, epon_path_10g_ds, key);\n");

    /* call API */
    err = bcmolt_cfg_clear(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_clear(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_path_10g_ds_cfg_get_multi(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_path_10g_ds_cfg cfg;        /**< declare main API struct */
    bcmolt_epon_path_10g_ds_key key = { };  /**< declare key */
    bcmolt_msg_set *msg_set = NULL;         /**< declare message set */
    uint32_t max_msgs;                      /**< declare max number of msgs to get */
    bcmos_bool invert_filter;               /**< declare filter invert flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_path_10g_ds_cfg cfg;\n");
    bcmcli_log("bcmolt_epon_path_10g_ds_key key = {  };\n");
    bcmcli_log("bcmolt_msg_set* msg_set = NULL;\n");
    bcmcli_log("uint32_t max_msgs;\n");
    bcmcli_log("bcmos_bool invert_filter;\n");
    apicli_print_start(session, "bcmolt_cfg_get_multi");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_10G_DS, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_PATH_10G_DS_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");

    /* set max number of msgs from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "max_msgs");
    if (cli_parm != NULL)
    {
        max_msgs = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "max_msgs is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("max_msgs = %d;\n", max_msgs);

    /* set filter invert flag from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "filter_invert");
    if (cli_parm != NULL)
    {
        invert_filter = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "filter_invert is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("invert_filter = %s;\n", (invert_filter) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* allocate message set */
    err = apicli_msg_set_alloc(byte_pool, BCMOLT_OBJ_ID_EPON_PATH_10G_DS, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);
    if (err != BCM_ERR_OK)
    {
        return err;
    }

    bcmcli_log("bcmolt_msg_set_alloc(BCMOLT_OBJ_ID_EPON_PATH_10G_DS, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, epon_path_10g_ds, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, epon_path_10g_ds, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "filter.fec_state");
    if (cli_parm != NULL)
    {
        bcmolt_epon_fec_en_state val;
        val = (bcmolt_epon_fec_en_state) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, epon_path_10g_ds, fec_state, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_path_10g_ds, fec_state, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_10G_DS, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_PATH_10G_DS_CFG_ID_FEC_STATE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "fec_state");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_path_10g_ds, fec_state);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_path_10g_ds, fec_state);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.prbs_generator.");
    if (cli_parm != NULL)
    {
        bcmolt_prbs_generator_config val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_generator.polynom");
        if (cli_parm != NULL)
        {
            val.polynom = (bcmolt_prbs_polynomial) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_generator.polynom is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_generator.error_insert");
        if (cli_parm != NULL)
        {
            val.error_insert = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_generator.error_insert is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_generator.invert");
        if (cli_parm != NULL)
        {
            val.invert = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_generator.invert is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_generator.control");
        if (cli_parm != NULL)
        {
            val.control = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_generator.control is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_path_10g_ds, prbs_generator, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_prbs_generator_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_10G_DS, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_PATH_10G_DS_CFG_ID_PRBS_GENERATOR, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_path_10g_ds, prbs_generator, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "prbs_generator");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_path_10g_ds, prbs_generator);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_path_10g_ds, prbs_generator);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_path_10g_ds, fec_state) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_path_10g_ds, prbs_generator))
    {
        BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_path_10g_ds, all_properties);
        bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_path_10g_ds, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);
    bcmcli_log("bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_path_10g_ds_stat_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_path_10g_ds_stat stat;      /**< declare main API struct */
    bcmolt_epon_path_10g_ds_key key = { };  /**< declare key */
    bcmos_bool clear_on_read;               /**< declare 'clear on read' flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_path_10g_ds_stat stat;\n");
    bcmcli_log("bcmolt_epon_path_10g_ds_key key = {  };\n");
    bcmcli_log("bcmos_bool clear_on_read;\n");
    apicli_print_start(session, "bcmolt_stat_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_10G_DS, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_PATH_10G_DS_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");

    /* set stat flags from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "clear");
    if (cli_parm != NULL)
    {
        clear_on_read = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "clear is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("clear_on_read = %s;\n", (clear_on_read) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* init the API struct */
    BCMOLT_STAT_INIT(&stat, epon_path_10g_ds, key);
    bcmcli_log("BCMOLT_STAT_INIT(&stat, epon_path_10g_ds, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "bytes");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_ds, bytes);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_ds, bytes);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_ds, frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_ds, frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_64");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_ds, frames_64);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_ds, frames_64);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_65_127");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_ds, frames_65_127);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_ds, frames_65_127);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_128_255");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_ds, frames_128_255);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_ds, frames_128_255);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_256_511");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_ds, frames_256_511);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_ds, frames_256_511);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_512_1023");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_ds, frames_512_1023);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_ds, frames_512_1023);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_1024_1518");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_ds, frames_1024_1518);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_ds, frames_1024_1518);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_1519_2047");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_ds, frames_1519_2047);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_ds, frames_1519_2047);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_2048_4095");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_ds, frames_2048_4095);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_ds, frames_2048_4095);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_4096_9216");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_ds, frames_4096_9216);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_ds, frames_4096_9216);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_9217_16383");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_ds, frames_9217_16383);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_ds, frames_9217_16383);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "broadcast_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_ds, broadcast_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_ds, broadcast_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "data_bytes");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_ds, data_bytes);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_ds, data_bytes);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "multicast_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_ds, multicast_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_ds, multicast_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "unicast_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_ds, unicast_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_ds, unicast_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "oam_bytes");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_ds, oam_bytes);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_ds, oam_bytes);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "oam_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_ds, oam_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_ds, oam_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "gate_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_ds, gate_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_ds, gate_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "mpcp_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_ds, mpcp_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_ds, mpcp_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "abort_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_ds, abort_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_ds, abort_frames);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_ds, bytes) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_ds, frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_ds, frames_64) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_ds, frames_65_127) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_ds, frames_128_255) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_ds, frames_256_511) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_ds, frames_512_1023) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_ds, frames_1024_1518) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_ds, frames_1519_2047) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_ds, frames_2048_4095) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_ds, frames_4096_9216) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_ds, frames_9217_16383) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_ds, broadcast_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_ds, data_bytes) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_ds, multicast_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_ds, unicast_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_ds, oam_bytes) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_ds, oam_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_ds, gate_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_ds, mpcp_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_ds, abort_frames))
    {
        BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_ds, all_properties);
        bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_ds, all_properties);\n");
    }

    /* call API */
    err = bcmolt_stat_get(device_id, &stat.hdr, clear_on_read);
    bcmcli_log("bcmolt_stat_get(device_id, &stat.hdr, clear_on_read);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &stat.hdr.hdr);
    }

    apicli_print_complete(session, err, stat.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_path_10g_ds_stat_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_path_10g_ds_stat_cfg stat_cfg;  /**< declare main API struct */
    bcmolt_epon_path_10g_ds_key key = { };      /**< declare key */
    bcmolt_epon_path_10g_ds_stat_id stat_id;    /**< declare stat ID */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_path_10g_ds_stat_cfg stat_cfg;\n");
    bcmcli_log("bcmolt_epon_path_10g_ds_key key = {  };\n");
    apicli_print_start(session, "bcmolt_stat_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_10G_DS, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_PATH_10G_DS_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");

    /* set stat ID from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "sub");
    if (cli_parm != NULL)
    {
        stat_id = (bcmolt_epon_path_10g_ds_stat_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
        return BCM_ERR_PARM;
    }

    /* init the API struct */
    switch (stat_id)
    {
        case BCMOLT_EPON_PATH_10G_DS_STAT_ID_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, bytes, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_64:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, frames_64, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, frames_64, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_65_127:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, frames_65_127, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, frames_65_127, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_128_255:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, frames_128_255, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, frames_128_255, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_256_511:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, frames_256_511, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, frames_256_511, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_512_1023:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, frames_512_1023, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, frames_512_1023, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_1024_1518:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, frames_1024_1518, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, frames_1024_1518, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_1519_2047:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, frames_1519_2047, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, frames_1519_2047, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_2048_4095:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, frames_2048_4095, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, frames_2048_4095, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_4096_9216:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, frames_4096_9216, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, frames_4096_9216, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_9217_16383:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, frames_9217_16383, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, frames_9217_16383, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_DS_STAT_ID_BROADCAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, broadcast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, broadcast_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_DS_STAT_ID_DATA_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, data_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, data_bytes, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_DS_STAT_ID_MULTICAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, multicast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, multicast_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_DS_STAT_ID_UNICAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, unicast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, unicast_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_DS_STAT_ID_OAM_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, oam_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, oam_bytes, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_DS_STAT_ID_OAM_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, oam_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, oam_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_DS_STAT_ID_GATE_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, gate_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, gate_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_DS_STAT_ID_MPCP_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, mpcp_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, mpcp_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_DS_STAT_ID_ABORT_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, abort_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, abort_frames, key);\n");
            break;
        default:
            apicli_print_complete(session, BCM_ERR_RANGE, "\n");
            return BCM_ERR_RANGE;
    }

    /* call API */
    err = bcmolt_stat_cfg_get(device_id, &stat_cfg.hdr);
    bcmcli_log("bcmolt_stat_cfg_get(device_id, &stat_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &stat_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, stat_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_path_10g_ds_stat_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_path_10g_ds_stat_cfg stat_cfg;  /**< declare main API struct */
    bcmolt_epon_path_10g_ds_key key = { };      /**< declare key */
    bcmolt_epon_path_10g_ds_stat_id stat_id;    /**< declare stat ID */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_path_10g_ds_stat_cfg stat_cfg;\n");
    bcmcli_log("bcmolt_epon_path_10g_ds_key key = {  };\n");
    apicli_print_start(session, "bcmolt_stat_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_10G_DS, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_PATH_10G_DS_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");

    /* set stat ID from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "sub");
    if (cli_parm != NULL)
    {
        stat_id = (bcmolt_epon_path_10g_ds_stat_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
        return BCM_ERR_PARM;
    }

    /* init the API struct */
    switch (stat_id)
    {
        case BCMOLT_EPON_PATH_10G_DS_STAT_ID_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, bytes, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_64:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, frames_64, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, frames_64, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_65_127:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, frames_65_127, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, frames_65_127, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_128_255:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, frames_128_255, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, frames_128_255, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_256_511:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, frames_256_511, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, frames_256_511, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_512_1023:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, frames_512_1023, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, frames_512_1023, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_1024_1518:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, frames_1024_1518, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, frames_1024_1518, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_1519_2047:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, frames_1519_2047, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, frames_1519_2047, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_2048_4095:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, frames_2048_4095, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, frames_2048_4095, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_4096_9216:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, frames_4096_9216, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, frames_4096_9216, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_9217_16383:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, frames_9217_16383, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, frames_9217_16383, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_DS_STAT_ID_BROADCAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, broadcast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, broadcast_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_DS_STAT_ID_DATA_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, data_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, data_bytes, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_DS_STAT_ID_MULTICAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, multicast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, multicast_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_DS_STAT_ID_UNICAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, unicast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, unicast_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_DS_STAT_ID_OAM_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, oam_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, oam_bytes, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_DS_STAT_ID_OAM_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, oam_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, oam_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_DS_STAT_ID_GATE_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, gate_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, gate_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_DS_STAT_ID_MPCP_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, mpcp_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, mpcp_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_DS_STAT_ID_ABORT_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, abort_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_ds, abort_frames, key);\n");
            break;
        default:
            apicli_print_complete(session, BCM_ERR_RANGE, "\n");
            return BCM_ERR_RANGE;
    }

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.");
    if (cli_parm != NULL)
    {
        bcmolt_stat_alarm_config val = { };
        cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.trigger.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.type");
            if (cli_parm != NULL)
            {
                val.trigger.type = (bcmolt_stat_condition_type) cli_parm->value.enum_val;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.type is not set\n");
                return BCM_ERR_PARM;
            }

            switch (val.trigger.type)
            {
                case BCMOLT_STAT_CONDITION_TYPE_RATE_THRESHOLD:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.rising");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_threshold.rising = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.rising is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.falling");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_threshold.falling = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.falling is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_RATE_RANGE:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.upper");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_range.upper = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.upper is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.lower");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_range.lower = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.lower is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_VALUE_THRESHOLD:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.limit");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.value_threshold.limit = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.limit is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_NONE:
                    break;
                default:
                    apicli_print_complete(session, BCM_ERR_RANGE, "\n");
                    return BCM_ERR_RANGE;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.soak.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "cfg.soak.active_soak_time");
            if (cli_parm != NULL)
            {
                val.soak.active_soak_time = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak.active_soak_time is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "cfg.soak.clear_soak_time");
            if (cli_parm != NULL)
            {
                val.soak.clear_soak_time = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak.clear_soak_time is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_STAT_CFG_PROP_SET(&stat_cfg, epon_path_10g_ds, cfg, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_stat_alarm_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_10G_DS, BCMOLT_MGT_GROUP_STAT_CFG, 0, BCMOLT_EPON_PATH_10G_DS_STAT_CFG_ID_CFG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_STAT_CFG_PROP_SET(&stat_cfg, epon_path_10g_ds, cfg, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_stat_cfg_set(device_id, &stat_cfg.hdr);
    bcmcli_log("bcmolt_stat_cfg_set(device_id, &stat_cfg.hdr);\n");
    apicli_print_complete(session, err, stat_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_path_10g_ds_auto_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_path_10g_ds_auto_cfg auto_cfg;  /**< declare main API struct */
    bcmolt_epon_path_10g_ds_key key = { };      /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_path_10g_ds_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_epon_path_10g_ds_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_get");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, epon_path_10g_ds, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, epon_path_10g_ds, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_cleared");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_path_10g_ds, stat_alarm_cleared);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_path_10g_ds, stat_alarm_cleared);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_raised");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_path_10g_ds, stat_alarm_raised);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_path_10g_ds, stat_alarm_raised);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_path_10g_ds, stat_alarm_cleared) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_path_10g_ds, stat_alarm_raised))
    {
        BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_path_10g_ds, all_properties);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_path_10g_ds, all_properties);\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &auto_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_path_10g_ds_auto_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_path_10g_ds_auto_cfg auto_cfg;  /**< declare main API struct */
    bcmolt_epon_path_10g_ds_key key = { };      /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_path_10g_ds_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_epon_path_10g_ds_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_set");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, epon_path_10g_ds, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, epon_path_10g_ds, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_cleared");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_path_10g_ds, stat_alarm_cleared, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_path_10g_ds, stat_alarm_cleared, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_10G_DS, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_PATH_10G_DS_AUTO_CFG_ID_STAT_ALARM_CLEARED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_raised");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_path_10g_ds, stat_alarm_raised, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_path_10g_ds, stat_alarm_raised, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_10G_DS, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_PATH_10G_DS_AUTO_CFG_ID_STAT_ALARM_RAISED, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);\n");
    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_path_10g_us_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_path_10g_us_cfg cfg;        /**< declare main API struct */
    bcmolt_epon_path_10g_us_key key = { };  /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_path_10g_us_cfg cfg;\n");
    bcmcli_log("bcmolt_epon_path_10g_us_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_10G_US, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_PATH_10G_US_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, epon_path_10g_us, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, epon_path_10g_us, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "fec_state");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_path_10g_us, fec_state);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_path_10g_us, fec_state);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "sync_time_tq");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_path_10g_us, sync_time_tq);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_path_10g_us, sync_time_tq);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "prbs_checker");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_path_10g_us, prbs_checker);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_path_10g_us, prbs_checker);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "prbs_status");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_path_10g_us, prbs_status);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_path_10g_us, prbs_status);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_CFG_PROP_IS_SET(&cfg, epon_path_10g_us, fec_state) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_path_10g_us, sync_time_tq) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_path_10g_us, prbs_checker) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_path_10g_us, prbs_status))
    {
        BCMOLT_CFG_PROP_GET(&cfg, epon_path_10g_us, all_properties);
        bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_path_10g_us, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_get(device_id, &cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_path_10g_us_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_path_10g_us_cfg cfg;        /**< declare main API struct */
    bcmolt_epon_path_10g_us_key key = { };  /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_path_10g_us_cfg cfg;\n");
    bcmcli_log("bcmolt_epon_path_10g_us_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_10G_US, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_PATH_10G_US_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, epon_path_10g_us, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, epon_path_10g_us, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "fec_state");
    if (cli_parm != NULL)
    {
        bcmolt_epon_fec_en_state val;
        val = (bcmolt_epon_fec_en_state) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, epon_path_10g_us, fec_state, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_path_10g_us, fec_state, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_10G_US, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_PATH_10G_US_CFG_ID_FEC_STATE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "sync_time_tq");
    if (cli_parm != NULL)
    {
        bcmolt_time_quanta val;
        val = (bcmolt_time_quanta) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, epon_path_10g_us, sync_time_tq, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_path_10g_us, sync_time_tq, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_10G_US, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_PATH_10G_US_CFG_ID_SYNC_TIME_TQ, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "prbs_checker.");
    if (cli_parm != NULL)
    {
        bcmolt_prbs_checker_config val = { };
        cli_parm = bcmcli_find_named_parm(session, "prbs_checker.polynom");
        if (cli_parm != NULL)
        {
            val.polynom = (bcmolt_prbs_polynomial) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "prbs_checker.polynom is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "prbs_checker.mode");
        if (cli_parm != NULL)
        {
            val.mode = (bcmolt_prbs_checker_mode) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "prbs_checker.mode is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "prbs_checker.data_invert");
        if (cli_parm != NULL)
        {
            val.data_invert = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "prbs_checker.data_invert is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "prbs_checker.control");
        if (cli_parm != NULL)
        {
            val.control = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "prbs_checker.control is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_path_10g_us, prbs_checker, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_prbs_checker_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_10G_US, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_PATH_10G_US_CFG_ID_PRBS_CHECKER, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_path_10g_us, prbs_checker, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_cfg_set(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_set(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_path_10g_us_cfg_clear(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_path_10g_us_cfg cfg;        /**< declare main API struct */
    bcmolt_epon_path_10g_us_key key = { };  /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_path_10g_us_cfg cfg;\n");
    bcmcli_log("bcmolt_epon_path_10g_us_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_clear");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_10G_US, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_PATH_10G_US_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, epon_path_10g_us, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, epon_path_10g_us, key);\n");

    /* call API */
    err = bcmolt_cfg_clear(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_clear(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_path_10g_us_cfg_get_multi(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_path_10g_us_cfg cfg;        /**< declare main API struct */
    bcmolt_epon_path_10g_us_key key = { };  /**< declare key */
    bcmolt_msg_set *msg_set = NULL;         /**< declare message set */
    uint32_t max_msgs;                      /**< declare max number of msgs to get */
    bcmos_bool invert_filter;               /**< declare filter invert flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_path_10g_us_cfg cfg;\n");
    bcmcli_log("bcmolt_epon_path_10g_us_key key = {  };\n");
    bcmcli_log("bcmolt_msg_set* msg_set = NULL;\n");
    bcmcli_log("uint32_t max_msgs;\n");
    bcmcli_log("bcmos_bool invert_filter;\n");
    apicli_print_start(session, "bcmolt_cfg_get_multi");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_10G_US, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_PATH_10G_US_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");

    /* set max number of msgs from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "max_msgs");
    if (cli_parm != NULL)
    {
        max_msgs = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "max_msgs is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("max_msgs = %d;\n", max_msgs);

    /* set filter invert flag from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "filter_invert");
    if (cli_parm != NULL)
    {
        invert_filter = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "filter_invert is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("invert_filter = %s;\n", (invert_filter) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* allocate message set */
    err = apicli_msg_set_alloc(byte_pool, BCMOLT_OBJ_ID_EPON_PATH_10G_US, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);
    if (err != BCM_ERR_OK)
    {
        return err;
    }

    bcmcli_log("bcmolt_msg_set_alloc(BCMOLT_OBJ_ID_EPON_PATH_10G_US, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, epon_path_10g_us, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, epon_path_10g_us, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "filter.fec_state");
    if (cli_parm != NULL)
    {
        bcmolt_epon_fec_en_state val;
        val = (bcmolt_epon_fec_en_state) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, epon_path_10g_us, fec_state, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_path_10g_us, fec_state, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_10G_US, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_PATH_10G_US_CFG_ID_FEC_STATE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "fec_state");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_path_10g_us, fec_state);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_path_10g_us, fec_state);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.sync_time_tq");
    if (cli_parm != NULL)
    {
        bcmolt_time_quanta val;
        val = (bcmolt_time_quanta) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, epon_path_10g_us, sync_time_tq, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_path_10g_us, sync_time_tq, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_10G_US, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_PATH_10G_US_CFG_ID_SYNC_TIME_TQ, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "sync_time_tq");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_path_10g_us, sync_time_tq);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_path_10g_us, sync_time_tq);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.prbs_checker.");
    if (cli_parm != NULL)
    {
        bcmolt_prbs_checker_config val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_checker.polynom");
        if (cli_parm != NULL)
        {
            val.polynom = (bcmolt_prbs_polynomial) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_checker.polynom is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_checker.mode");
        if (cli_parm != NULL)
        {
            val.mode = (bcmolt_prbs_checker_mode) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_checker.mode is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_checker.data_invert");
        if (cli_parm != NULL)
        {
            val.data_invert = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_checker.data_invert is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_checker.control");
        if (cli_parm != NULL)
        {
            val.control = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_checker.control is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_path_10g_us, prbs_checker, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_prbs_checker_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_10G_US, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_PATH_10G_US_CFG_ID_PRBS_CHECKER, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_path_10g_us, prbs_checker, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "prbs_checker");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_path_10g_us, prbs_checker);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_path_10g_us, prbs_checker);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.prbs_status.");
    if (cli_parm != NULL)
    {
        bcmolt_prbs_status val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_status.lock_state");
        if (cli_parm != NULL)
        {
            val.lock_state = (bcmolt_prbs_lock_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_status.lock_state is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_status.error_counts");
        if (cli_parm != NULL)
        {
            val.error_counts = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_status.error_counts is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_path_10g_us, prbs_status, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_prbs_status val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_10G_US, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_PATH_10G_US_CFG_ID_PRBS_STATUS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_path_10g_us, prbs_status, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "prbs_status");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_path_10g_us, prbs_status);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_path_10g_us, prbs_status);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_path_10g_us, fec_state) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_path_10g_us, sync_time_tq) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_path_10g_us, prbs_checker) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_path_10g_us, prbs_status))
    {
        BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_path_10g_us, all_properties);
        bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_path_10g_us, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);
    bcmcli_log("bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_path_10g_us_stat_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_path_10g_us_stat stat;      /**< declare main API struct */
    bcmolt_epon_path_10g_us_key key = { };  /**< declare key */
    bcmos_bool clear_on_read;               /**< declare 'clear on read' flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_path_10g_us_stat stat;\n");
    bcmcli_log("bcmolt_epon_path_10g_us_key key = {  };\n");
    bcmcli_log("bcmos_bool clear_on_read;\n");
    apicli_print_start(session, "bcmolt_stat_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_10G_US, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_PATH_10G_US_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");

    /* set stat flags from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "clear");
    if (cli_parm != NULL)
    {
        clear_on_read = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "clear is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("clear_on_read = %s;\n", (clear_on_read) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* init the API struct */
    BCMOLT_STAT_INIT(&stat, epon_path_10g_us, key);
    bcmcli_log("BCMOLT_STAT_INIT(&stat, epon_path_10g_us, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "bytes");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, bytes);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, bytes);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_64");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, frames_64);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, frames_64);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_65_127");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, frames_65_127);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, frames_65_127);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_128_255");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, frames_128_255);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, frames_128_255);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_256_511");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, frames_256_511);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, frames_256_511);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_512_1023");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, frames_512_1023);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, frames_512_1023);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_1024_1518");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, frames_1024_1518);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, frames_1024_1518);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_1519_2047");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, frames_1519_2047);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, frames_1519_2047);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_2048_4095");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, frames_2048_4095);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, frames_2048_4095);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_4096_9216");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, frames_4096_9216);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, frames_4096_9216);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_9217_16383");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, frames_9217_16383);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, frames_9217_16383);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "broadcast_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, broadcast_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, broadcast_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "data_bytes");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, data_bytes);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, data_bytes);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "multicast_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, multicast_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, multicast_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "unicast_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, unicast_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, unicast_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "mpcp_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, mpcp_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, mpcp_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "oam_bytes");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, oam_bytes);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, oam_bytes);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "oam_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, oam_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, oam_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "report_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, report_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, report_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "abort_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, abort_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, abort_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "fcs_error");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, fcs_error);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, fcs_error);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "crc_8_error");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, crc_8_error);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, crc_8_error);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "out_of_slot");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, out_of_slot);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, out_of_slot);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "oversize_error");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, oversize_error);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, oversize_error);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "runt_error");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, runt_error);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, runt_error);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_us, bytes) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_us, frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_us, frames_64) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_us, frames_65_127) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_us, frames_128_255) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_us, frames_256_511) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_us, frames_512_1023) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_us, frames_1024_1518) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_us, frames_1519_2047) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_us, frames_2048_4095) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_us, frames_4096_9216) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_us, frames_9217_16383) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_us, broadcast_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_us, data_bytes) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_us, multicast_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_us, unicast_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_us, mpcp_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_us, oam_bytes) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_us, oam_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_us, report_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_us, abort_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_us, fcs_error) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_us, crc_8_error) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_us, out_of_slot) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_us, oversize_error) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_10g_us, runt_error))
    {
        BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, all_properties);
        bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_10g_us, all_properties);\n");
    }

    /* call API */
    err = bcmolt_stat_get(device_id, &stat.hdr, clear_on_read);
    bcmcli_log("bcmolt_stat_get(device_id, &stat.hdr, clear_on_read);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &stat.hdr.hdr);
    }

    apicli_print_complete(session, err, stat.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_path_10g_us_stat_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_path_10g_us_stat_cfg stat_cfg;  /**< declare main API struct */
    bcmolt_epon_path_10g_us_key key = { };      /**< declare key */
    bcmolt_epon_path_10g_us_stat_id stat_id;    /**< declare stat ID */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_path_10g_us_stat_cfg stat_cfg;\n");
    bcmcli_log("bcmolt_epon_path_10g_us_key key = {  };\n");
    apicli_print_start(session, "bcmolt_stat_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_10G_US, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_PATH_10G_US_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");

    /* set stat ID from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "sub");
    if (cli_parm != NULL)
    {
        stat_id = (bcmolt_epon_path_10g_us_stat_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
        return BCM_ERR_PARM;
    }

    /* init the API struct */
    switch (stat_id)
    {
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, bytes, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_64:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, frames_64, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, frames_64, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_65_127:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, frames_65_127, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, frames_65_127, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_128_255:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, frames_128_255, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, frames_128_255, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_256_511:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, frames_256_511, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, frames_256_511, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_512_1023:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, frames_512_1023, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, frames_512_1023, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_1024_1518:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, frames_1024_1518, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, frames_1024_1518, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_1519_2047:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, frames_1519_2047, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, frames_1519_2047, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_2048_4095:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, frames_2048_4095, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, frames_2048_4095, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_4096_9216:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, frames_4096_9216, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, frames_4096_9216, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_9217_16383:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, frames_9217_16383, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, frames_9217_16383, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_BROADCAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, broadcast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, broadcast_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_DATA_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, data_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, data_bytes, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_MULTICAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, multicast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, multicast_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_UNICAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, unicast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, unicast_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_MPCP_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, mpcp_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, mpcp_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_OAM_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, oam_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, oam_bytes, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_OAM_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, oam_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, oam_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_REPORT_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, report_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, report_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_ABORT_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, abort_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, abort_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_FCS_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, fcs_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, fcs_error, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_CRC_8_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, crc_8_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, crc_8_error, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_OUT_OF_SLOT:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, out_of_slot, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, out_of_slot, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_OVERSIZE_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, oversize_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, oversize_error, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_RUNT_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, runt_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, runt_error, key);\n");
            break;
        default:
            apicli_print_complete(session, BCM_ERR_RANGE, "\n");
            return BCM_ERR_RANGE;
    }

    /* call API */
    err = bcmolt_stat_cfg_get(device_id, &stat_cfg.hdr);
    bcmcli_log("bcmolt_stat_cfg_get(device_id, &stat_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &stat_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, stat_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_path_10g_us_stat_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_path_10g_us_stat_cfg stat_cfg;  /**< declare main API struct */
    bcmolt_epon_path_10g_us_key key = { };      /**< declare key */
    bcmolt_epon_path_10g_us_stat_id stat_id;    /**< declare stat ID */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_path_10g_us_stat_cfg stat_cfg;\n");
    bcmcli_log("bcmolt_epon_path_10g_us_key key = {  };\n");
    apicli_print_start(session, "bcmolt_stat_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_10G_US, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_PATH_10G_US_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");

    /* set stat ID from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "sub");
    if (cli_parm != NULL)
    {
        stat_id = (bcmolt_epon_path_10g_us_stat_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
        return BCM_ERR_PARM;
    }

    /* init the API struct */
    switch (stat_id)
    {
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, bytes, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_64:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, frames_64, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, frames_64, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_65_127:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, frames_65_127, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, frames_65_127, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_128_255:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, frames_128_255, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, frames_128_255, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_256_511:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, frames_256_511, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, frames_256_511, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_512_1023:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, frames_512_1023, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, frames_512_1023, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_1024_1518:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, frames_1024_1518, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, frames_1024_1518, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_1519_2047:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, frames_1519_2047, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, frames_1519_2047, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_2048_4095:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, frames_2048_4095, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, frames_2048_4095, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_4096_9216:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, frames_4096_9216, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, frames_4096_9216, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_9217_16383:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, frames_9217_16383, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, frames_9217_16383, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_BROADCAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, broadcast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, broadcast_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_DATA_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, data_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, data_bytes, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_MULTICAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, multicast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, multicast_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_UNICAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, unicast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, unicast_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_MPCP_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, mpcp_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, mpcp_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_OAM_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, oam_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, oam_bytes, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_OAM_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, oam_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, oam_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_REPORT_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, report_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, report_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_ABORT_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, abort_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, abort_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_FCS_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, fcs_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, fcs_error, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_CRC_8_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, crc_8_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, crc_8_error, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_OUT_OF_SLOT:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, out_of_slot, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, out_of_slot, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_OVERSIZE_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, oversize_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, oversize_error, key);\n");
            break;
        case BCMOLT_EPON_PATH_10G_US_STAT_ID_RUNT_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, runt_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_10g_us, runt_error, key);\n");
            break;
        default:
            apicli_print_complete(session, BCM_ERR_RANGE, "\n");
            return BCM_ERR_RANGE;
    }

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.");
    if (cli_parm != NULL)
    {
        bcmolt_stat_alarm_config val = { };
        cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.trigger.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.type");
            if (cli_parm != NULL)
            {
                val.trigger.type = (bcmolt_stat_condition_type) cli_parm->value.enum_val;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.type is not set\n");
                return BCM_ERR_PARM;
            }

            switch (val.trigger.type)
            {
                case BCMOLT_STAT_CONDITION_TYPE_RATE_THRESHOLD:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.rising");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_threshold.rising = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.rising is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.falling");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_threshold.falling = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.falling is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_RATE_RANGE:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.upper");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_range.upper = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.upper is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.lower");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_range.lower = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.lower is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_VALUE_THRESHOLD:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.limit");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.value_threshold.limit = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.limit is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_NONE:
                    break;
                default:
                    apicli_print_complete(session, BCM_ERR_RANGE, "\n");
                    return BCM_ERR_RANGE;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.soak.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "cfg.soak.active_soak_time");
            if (cli_parm != NULL)
            {
                val.soak.active_soak_time = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak.active_soak_time is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "cfg.soak.clear_soak_time");
            if (cli_parm != NULL)
            {
                val.soak.clear_soak_time = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak.clear_soak_time is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_STAT_CFG_PROP_SET(&stat_cfg, epon_path_10g_us, cfg, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_stat_alarm_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_10G_US, BCMOLT_MGT_GROUP_STAT_CFG, 0, BCMOLT_EPON_PATH_10G_US_STAT_CFG_ID_CFG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_STAT_CFG_PROP_SET(&stat_cfg, epon_path_10g_us, cfg, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_stat_cfg_set(device_id, &stat_cfg.hdr);
    bcmcli_log("bcmolt_stat_cfg_set(device_id, &stat_cfg.hdr);\n");
    apicli_print_complete(session, err, stat_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_path_10g_us_auto_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_path_10g_us_auto_cfg auto_cfg;  /**< declare main API struct */
    bcmolt_epon_path_10g_us_key key = { };      /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_path_10g_us_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_epon_path_10g_us_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_get");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, epon_path_10g_us, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, epon_path_10g_us, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_cleared");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_path_10g_us, stat_alarm_cleared);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_path_10g_us, stat_alarm_cleared);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_raised");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_path_10g_us, stat_alarm_raised);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_path_10g_us, stat_alarm_raised);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_path_10g_us, stat_alarm_cleared) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_path_10g_us, stat_alarm_raised))
    {
        BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_path_10g_us, all_properties);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_path_10g_us, all_properties);\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &auto_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_path_10g_us_auto_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_path_10g_us_auto_cfg auto_cfg;  /**< declare main API struct */
    bcmolt_epon_path_10g_us_key key = { };      /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_path_10g_us_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_epon_path_10g_us_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_set");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, epon_path_10g_us, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, epon_path_10g_us, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_cleared");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_path_10g_us, stat_alarm_cleared, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_path_10g_us, stat_alarm_cleared, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_10G_US, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_PATH_10G_US_AUTO_CFG_ID_STAT_ALARM_CLEARED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_raised");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_path_10g_us, stat_alarm_raised, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_path_10g_us, stat_alarm_raised, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_10G_US, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_PATH_10G_US_AUTO_CFG_ID_STAT_ALARM_RAISED, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);\n");
    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_path_1g_ds_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_path_1g_ds_cfg cfg;         /**< declare main API struct */
    bcmolt_epon_path_1g_ds_key key = { };   /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_path_1g_ds_cfg cfg;\n");
    bcmcli_log("bcmolt_epon_path_1g_ds_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_1G_DS, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_PATH_1G_DS_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, epon_path_1g_ds, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, epon_path_1g_ds, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "default_fec_state");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_path_1g_ds, default_fec_state);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_path_1g_ds, default_fec_state);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "raman_mode");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_path_1g_ds, raman_mode);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_path_1g_ds, raman_mode);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "turbo_2g_mode");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_path_1g_ds, turbo_2g_mode);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_path_1g_ds, turbo_2g_mode);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "prbs_generator");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_path_1g_ds, prbs_generator);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_path_1g_ds, prbs_generator);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_CFG_PROP_IS_SET(&cfg, epon_path_1g_ds, default_fec_state) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_path_1g_ds, raman_mode) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_path_1g_ds, turbo_2g_mode) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_path_1g_ds, prbs_generator))
    {
        BCMOLT_CFG_PROP_GET(&cfg, epon_path_1g_ds, all_properties);
        bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_path_1g_ds, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_get(device_id, &cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_path_1g_ds_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_path_1g_ds_cfg cfg;         /**< declare main API struct */
    bcmolt_epon_path_1g_ds_key key = { };   /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_path_1g_ds_cfg cfg;\n");
    bcmcli_log("bcmolt_epon_path_1g_ds_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_1G_DS, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_PATH_1G_DS_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, epon_path_1g_ds, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, epon_path_1g_ds, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "default_fec_state");
    if (cli_parm != NULL)
    {
        bcmolt_epon_fec_en_state val;
        val = (bcmolt_epon_fec_en_state) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, epon_path_1g_ds, default_fec_state, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_path_1g_ds, default_fec_state, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_1G_DS, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_PATH_1G_DS_CFG_ID_DEFAULT_FEC_STATE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "raman_mode");
    if (cli_parm != NULL)
    {
        bcmolt_raman_mitigation_mode val;
        val = (bcmolt_raman_mitigation_mode) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, epon_path_1g_ds, raman_mode, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_path_1g_ds, raman_mode, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_1G_DS, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_PATH_1G_DS_CFG_ID_RAMAN_MODE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "turbo_2g_mode");
    if (cli_parm != NULL)
    {
        bcmolt_epon_1g_turbo_mode val;
        val = (bcmolt_epon_1g_turbo_mode) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, epon_path_1g_ds, turbo_2g_mode, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_path_1g_ds, turbo_2g_mode, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_1G_DS, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_PATH_1G_DS_CFG_ID_TURBO_2G_MODE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "prbs_generator.");
    if (cli_parm != NULL)
    {
        bcmolt_prbs_generator_config val = { };
        cli_parm = bcmcli_find_named_parm(session, "prbs_generator.polynom");
        if (cli_parm != NULL)
        {
            val.polynom = (bcmolt_prbs_polynomial) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "prbs_generator.polynom is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "prbs_generator.error_insert");
        if (cli_parm != NULL)
        {
            val.error_insert = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "prbs_generator.error_insert is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "prbs_generator.invert");
        if (cli_parm != NULL)
        {
            val.invert = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "prbs_generator.invert is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "prbs_generator.control");
        if (cli_parm != NULL)
        {
            val.control = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "prbs_generator.control is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_path_1g_ds, prbs_generator, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_prbs_generator_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_1G_DS, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_PATH_1G_DS_CFG_ID_PRBS_GENERATOR, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_path_1g_ds, prbs_generator, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_cfg_set(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_set(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_path_1g_ds_cfg_clear(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_path_1g_ds_cfg cfg;         /**< declare main API struct */
    bcmolt_epon_path_1g_ds_key key = { };   /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_path_1g_ds_cfg cfg;\n");
    bcmcli_log("bcmolt_epon_path_1g_ds_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_clear");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_1G_DS, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_PATH_1G_DS_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, epon_path_1g_ds, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, epon_path_1g_ds, key);\n");

    /* call API */
    err = bcmolt_cfg_clear(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_clear(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_path_1g_ds_cfg_get_multi(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_path_1g_ds_cfg cfg;         /**< declare main API struct */
    bcmolt_epon_path_1g_ds_key key = { };   /**< declare key */
    bcmolt_msg_set *msg_set = NULL;         /**< declare message set */
    uint32_t max_msgs;                      /**< declare max number of msgs to get */
    bcmos_bool invert_filter;               /**< declare filter invert flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_path_1g_ds_cfg cfg;\n");
    bcmcli_log("bcmolt_epon_path_1g_ds_key key = {  };\n");
    bcmcli_log("bcmolt_msg_set* msg_set = NULL;\n");
    bcmcli_log("uint32_t max_msgs;\n");
    bcmcli_log("bcmos_bool invert_filter;\n");
    apicli_print_start(session, "bcmolt_cfg_get_multi");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_1G_DS, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_PATH_1G_DS_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");

    /* set max number of msgs from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "max_msgs");
    if (cli_parm != NULL)
    {
        max_msgs = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "max_msgs is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("max_msgs = %d;\n", max_msgs);

    /* set filter invert flag from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "filter_invert");
    if (cli_parm != NULL)
    {
        invert_filter = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "filter_invert is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("invert_filter = %s;\n", (invert_filter) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* allocate message set */
    err = apicli_msg_set_alloc(byte_pool, BCMOLT_OBJ_ID_EPON_PATH_1G_DS, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);
    if (err != BCM_ERR_OK)
    {
        return err;
    }

    bcmcli_log("bcmolt_msg_set_alloc(BCMOLT_OBJ_ID_EPON_PATH_1G_DS, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, epon_path_1g_ds, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, epon_path_1g_ds, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "filter.default_fec_state");
    if (cli_parm != NULL)
    {
        bcmolt_epon_fec_en_state val;
        val = (bcmolt_epon_fec_en_state) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, epon_path_1g_ds, default_fec_state, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_path_1g_ds, default_fec_state, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_1G_DS, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_PATH_1G_DS_CFG_ID_DEFAULT_FEC_STATE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "default_fec_state");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_path_1g_ds, default_fec_state);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_path_1g_ds, default_fec_state);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.raman_mode");
    if (cli_parm != NULL)
    {
        bcmolt_raman_mitigation_mode val;
        val = (bcmolt_raman_mitigation_mode) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, epon_path_1g_ds, raman_mode, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_path_1g_ds, raman_mode, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_1G_DS, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_PATH_1G_DS_CFG_ID_RAMAN_MODE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "raman_mode");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_path_1g_ds, raman_mode);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_path_1g_ds, raman_mode);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.turbo_2g_mode");
    if (cli_parm != NULL)
    {
        bcmolt_epon_1g_turbo_mode val;
        val = (bcmolt_epon_1g_turbo_mode) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, epon_path_1g_ds, turbo_2g_mode, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_path_1g_ds, turbo_2g_mode, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_1G_DS, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_PATH_1G_DS_CFG_ID_TURBO_2G_MODE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "turbo_2g_mode");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_path_1g_ds, turbo_2g_mode);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_path_1g_ds, turbo_2g_mode);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.prbs_generator.");
    if (cli_parm != NULL)
    {
        bcmolt_prbs_generator_config val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_generator.polynom");
        if (cli_parm != NULL)
        {
            val.polynom = (bcmolt_prbs_polynomial) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_generator.polynom is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_generator.error_insert");
        if (cli_parm != NULL)
        {
            val.error_insert = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_generator.error_insert is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_generator.invert");
        if (cli_parm != NULL)
        {
            val.invert = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_generator.invert is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_generator.control");
        if (cli_parm != NULL)
        {
            val.control = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_generator.control is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_path_1g_ds, prbs_generator, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_prbs_generator_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_1G_DS, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_PATH_1G_DS_CFG_ID_PRBS_GENERATOR, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_path_1g_ds, prbs_generator, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "prbs_generator");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_path_1g_ds, prbs_generator);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_path_1g_ds, prbs_generator);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_path_1g_ds, default_fec_state) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_path_1g_ds, raman_mode) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_path_1g_ds, turbo_2g_mode) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_path_1g_ds, prbs_generator))
    {
        BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_path_1g_ds, all_properties);
        bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_path_1g_ds, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);
    bcmcli_log("bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_path_1g_ds_stat_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_path_1g_ds_stat stat;       /**< declare main API struct */
    bcmolt_epon_path_1g_ds_key key = { };   /**< declare key */
    bcmos_bool clear_on_read;               /**< declare 'clear on read' flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_path_1g_ds_stat stat;\n");
    bcmcli_log("bcmolt_epon_path_1g_ds_key key = {  };\n");
    bcmcli_log("bcmos_bool clear_on_read;\n");
    apicli_print_start(session, "bcmolt_stat_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_1G_DS, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_PATH_1G_DS_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");

    /* set stat flags from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "clear");
    if (cli_parm != NULL)
    {
        clear_on_read = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "clear is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("clear_on_read = %s;\n", (clear_on_read) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* init the API struct */
    BCMOLT_STAT_INIT(&stat, epon_path_1g_ds, key);
    bcmcli_log("BCMOLT_STAT_INIT(&stat, epon_path_1g_ds, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "bytes");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_ds, bytes);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_ds, bytes);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_ds, frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_ds, frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_64");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_ds, frames_64);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_ds, frames_64);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_65_127");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_ds, frames_65_127);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_ds, frames_65_127);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_128_255");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_ds, frames_128_255);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_ds, frames_128_255);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_256_511");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_ds, frames_256_511);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_ds, frames_256_511);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_512_1023");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_ds, frames_512_1023);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_ds, frames_512_1023);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_1024_1518");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_ds, frames_1024_1518);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_ds, frames_1024_1518);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_1519_2047");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_ds, frames_1519_2047);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_ds, frames_1519_2047);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_2048_4095");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_ds, frames_2048_4095);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_ds, frames_2048_4095);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_4096_9216");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_ds, frames_4096_9216);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_ds, frames_4096_9216);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_9217_16383");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_ds, frames_9217_16383);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_ds, frames_9217_16383);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "broadcast_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_ds, broadcast_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_ds, broadcast_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "data_bytes");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_ds, data_bytes);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_ds, data_bytes);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "multicast_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_ds, multicast_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_ds, multicast_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "unicast_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_ds, unicast_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_ds, unicast_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "oam_bytes");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_ds, oam_bytes);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_ds, oam_bytes);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "oam_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_ds, oam_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_ds, oam_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "gate_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_ds, gate_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_ds, gate_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "mpcp_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_ds, mpcp_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_ds, mpcp_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "abort_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_ds, abort_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_ds, abort_frames);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_ds, bytes) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_ds, frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_ds, frames_64) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_ds, frames_65_127) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_ds, frames_128_255) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_ds, frames_256_511) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_ds, frames_512_1023) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_ds, frames_1024_1518) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_ds, frames_1519_2047) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_ds, frames_2048_4095) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_ds, frames_4096_9216) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_ds, frames_9217_16383) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_ds, broadcast_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_ds, data_bytes) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_ds, multicast_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_ds, unicast_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_ds, oam_bytes) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_ds, oam_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_ds, gate_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_ds, mpcp_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_ds, abort_frames))
    {
        BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_ds, all_properties);
        bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_ds, all_properties);\n");
    }

    /* call API */
    err = bcmolt_stat_get(device_id, &stat.hdr, clear_on_read);
    bcmcli_log("bcmolt_stat_get(device_id, &stat.hdr, clear_on_read);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &stat.hdr.hdr);
    }

    apicli_print_complete(session, err, stat.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_path_1g_ds_stat_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_path_1g_ds_stat_cfg stat_cfg;   /**< declare main API struct */
    bcmolt_epon_path_1g_ds_key key = { };       /**< declare key */
    bcmolt_epon_path_1g_ds_stat_id stat_id;     /**< declare stat ID */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_path_1g_ds_stat_cfg stat_cfg;\n");
    bcmcli_log("bcmolt_epon_path_1g_ds_key key = {  };\n");
    apicli_print_start(session, "bcmolt_stat_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_1G_DS, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_PATH_1G_DS_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");

    /* set stat ID from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "sub");
    if (cli_parm != NULL)
    {
        stat_id = (bcmolt_epon_path_1g_ds_stat_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
        return BCM_ERR_PARM;
    }

    /* init the API struct */
    switch (stat_id)
    {
        case BCMOLT_EPON_PATH_1G_DS_STAT_ID_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, bytes, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_64:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, frames_64, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, frames_64, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_65_127:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, frames_65_127, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, frames_65_127, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_128_255:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, frames_128_255, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, frames_128_255, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_256_511:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, frames_256_511, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, frames_256_511, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_512_1023:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, frames_512_1023, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, frames_512_1023, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_1024_1518:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, frames_1024_1518, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, frames_1024_1518, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_1519_2047:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, frames_1519_2047, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, frames_1519_2047, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_2048_4095:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, frames_2048_4095, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, frames_2048_4095, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_4096_9216:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, frames_4096_9216, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, frames_4096_9216, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_9217_16383:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, frames_9217_16383, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, frames_9217_16383, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_DS_STAT_ID_BROADCAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, broadcast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, broadcast_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_DS_STAT_ID_DATA_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, data_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, data_bytes, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_DS_STAT_ID_MULTICAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, multicast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, multicast_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_DS_STAT_ID_UNICAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, unicast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, unicast_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_DS_STAT_ID_OAM_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, oam_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, oam_bytes, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_DS_STAT_ID_OAM_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, oam_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, oam_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_DS_STAT_ID_GATE_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, gate_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, gate_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_DS_STAT_ID_MPCP_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, mpcp_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, mpcp_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_DS_STAT_ID_ABORT_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, abort_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, abort_frames, key);\n");
            break;
        default:
            apicli_print_complete(session, BCM_ERR_RANGE, "\n");
            return BCM_ERR_RANGE;
    }

    /* call API */
    err = bcmolt_stat_cfg_get(device_id, &stat_cfg.hdr);
    bcmcli_log("bcmolt_stat_cfg_get(device_id, &stat_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &stat_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, stat_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_path_1g_ds_stat_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_path_1g_ds_stat_cfg stat_cfg;   /**< declare main API struct */
    bcmolt_epon_path_1g_ds_key key = { };       /**< declare key */
    bcmolt_epon_path_1g_ds_stat_id stat_id;     /**< declare stat ID */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_path_1g_ds_stat_cfg stat_cfg;\n");
    bcmcli_log("bcmolt_epon_path_1g_ds_key key = {  };\n");
    apicli_print_start(session, "bcmolt_stat_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_1G_DS, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_PATH_1G_DS_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");

    /* set stat ID from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "sub");
    if (cli_parm != NULL)
    {
        stat_id = (bcmolt_epon_path_1g_ds_stat_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
        return BCM_ERR_PARM;
    }

    /* init the API struct */
    switch (stat_id)
    {
        case BCMOLT_EPON_PATH_1G_DS_STAT_ID_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, bytes, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_64:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, frames_64, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, frames_64, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_65_127:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, frames_65_127, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, frames_65_127, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_128_255:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, frames_128_255, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, frames_128_255, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_256_511:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, frames_256_511, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, frames_256_511, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_512_1023:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, frames_512_1023, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, frames_512_1023, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_1024_1518:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, frames_1024_1518, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, frames_1024_1518, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_1519_2047:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, frames_1519_2047, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, frames_1519_2047, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_2048_4095:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, frames_2048_4095, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, frames_2048_4095, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_4096_9216:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, frames_4096_9216, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, frames_4096_9216, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_9217_16383:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, frames_9217_16383, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, frames_9217_16383, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_DS_STAT_ID_BROADCAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, broadcast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, broadcast_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_DS_STAT_ID_DATA_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, data_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, data_bytes, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_DS_STAT_ID_MULTICAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, multicast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, multicast_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_DS_STAT_ID_UNICAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, unicast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, unicast_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_DS_STAT_ID_OAM_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, oam_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, oam_bytes, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_DS_STAT_ID_OAM_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, oam_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, oam_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_DS_STAT_ID_GATE_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, gate_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, gate_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_DS_STAT_ID_MPCP_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, mpcp_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, mpcp_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_DS_STAT_ID_ABORT_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, abort_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_ds, abort_frames, key);\n");
            break;
        default:
            apicli_print_complete(session, BCM_ERR_RANGE, "\n");
            return BCM_ERR_RANGE;
    }

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.");
    if (cli_parm != NULL)
    {
        bcmolt_stat_alarm_config val = { };
        cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.trigger.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.type");
            if (cli_parm != NULL)
            {
                val.trigger.type = (bcmolt_stat_condition_type) cli_parm->value.enum_val;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.type is not set\n");
                return BCM_ERR_PARM;
            }

            switch (val.trigger.type)
            {
                case BCMOLT_STAT_CONDITION_TYPE_RATE_THRESHOLD:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.rising");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_threshold.rising = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.rising is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.falling");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_threshold.falling = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.falling is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_RATE_RANGE:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.upper");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_range.upper = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.upper is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.lower");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_range.lower = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.lower is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_VALUE_THRESHOLD:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.limit");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.value_threshold.limit = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.limit is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_NONE:
                    break;
                default:
                    apicli_print_complete(session, BCM_ERR_RANGE, "\n");
                    return BCM_ERR_RANGE;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.soak.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "cfg.soak.active_soak_time");
            if (cli_parm != NULL)
            {
                val.soak.active_soak_time = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak.active_soak_time is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "cfg.soak.clear_soak_time");
            if (cli_parm != NULL)
            {
                val.soak.clear_soak_time = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak.clear_soak_time is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_STAT_CFG_PROP_SET(&stat_cfg, epon_path_1g_ds, cfg, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_stat_alarm_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_1G_DS, BCMOLT_MGT_GROUP_STAT_CFG, 0, BCMOLT_EPON_PATH_1G_DS_STAT_CFG_ID_CFG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_STAT_CFG_PROP_SET(&stat_cfg, epon_path_1g_ds, cfg, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_stat_cfg_set(device_id, &stat_cfg.hdr);
    bcmcli_log("bcmolt_stat_cfg_set(device_id, &stat_cfg.hdr);\n");
    apicli_print_complete(session, err, stat_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_path_1g_ds_auto_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_path_1g_ds_auto_cfg auto_cfg;   /**< declare main API struct */
    bcmolt_epon_path_1g_ds_key key = { };       /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_path_1g_ds_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_epon_path_1g_ds_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_get");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, epon_path_1g_ds, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, epon_path_1g_ds, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_cleared");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_path_1g_ds, stat_alarm_cleared);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_path_1g_ds, stat_alarm_cleared);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_raised");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_path_1g_ds, stat_alarm_raised);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_path_1g_ds, stat_alarm_raised);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_path_1g_ds, stat_alarm_cleared) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_path_1g_ds, stat_alarm_raised))
    {
        BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_path_1g_ds, all_properties);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_path_1g_ds, all_properties);\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &auto_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_path_1g_ds_auto_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_path_1g_ds_auto_cfg auto_cfg;   /**< declare main API struct */
    bcmolt_epon_path_1g_ds_key key = { };       /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_path_1g_ds_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_epon_path_1g_ds_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_set");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, epon_path_1g_ds, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, epon_path_1g_ds, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_cleared");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_path_1g_ds, stat_alarm_cleared, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_path_1g_ds, stat_alarm_cleared, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_1G_DS, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_PATH_1G_DS_AUTO_CFG_ID_STAT_ALARM_CLEARED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_raised");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_path_1g_ds, stat_alarm_raised, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_path_1g_ds, stat_alarm_raised, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_1G_DS, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_PATH_1G_DS_AUTO_CFG_ID_STAT_ALARM_RAISED, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);\n");
    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_path_1g_us_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_path_1g_us_cfg cfg;         /**< declare main API struct */
    bcmolt_epon_path_1g_us_key key = { };   /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_path_1g_us_cfg cfg;\n");
    bcmcli_log("bcmolt_epon_path_1g_us_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_1G_US, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_PATH_1G_US_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, epon_path_1g_us, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, epon_path_1g_us, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "default_fec_state");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_path_1g_us, default_fec_state);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_path_1g_us, default_fec_state);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "sync_time_tq");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_path_1g_us, sync_time_tq);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_path_1g_us, sync_time_tq);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "prbs_checker");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_path_1g_us, prbs_checker);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_path_1g_us, prbs_checker);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "prbs_status");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_path_1g_us, prbs_status);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_path_1g_us, prbs_status);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_CFG_PROP_IS_SET(&cfg, epon_path_1g_us, default_fec_state) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_path_1g_us, sync_time_tq) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_path_1g_us, prbs_checker) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_path_1g_us, prbs_status))
    {
        BCMOLT_CFG_PROP_GET(&cfg, epon_path_1g_us, all_properties);
        bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_path_1g_us, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_get(device_id, &cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_path_1g_us_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_path_1g_us_cfg cfg;         /**< declare main API struct */
    bcmolt_epon_path_1g_us_key key = { };   /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_path_1g_us_cfg cfg;\n");
    bcmcli_log("bcmolt_epon_path_1g_us_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_1G_US, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_PATH_1G_US_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, epon_path_1g_us, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, epon_path_1g_us, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "default_fec_state");
    if (cli_parm != NULL)
    {
        bcmolt_epon_fec_en_state val;
        val = (bcmolt_epon_fec_en_state) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, epon_path_1g_us, default_fec_state, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_path_1g_us, default_fec_state, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_1G_US, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_PATH_1G_US_CFG_ID_DEFAULT_FEC_STATE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "sync_time_tq");
    if (cli_parm != NULL)
    {
        bcmolt_time_quanta val;
        val = (bcmolt_time_quanta) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, epon_path_1g_us, sync_time_tq, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_path_1g_us, sync_time_tq, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_1G_US, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_PATH_1G_US_CFG_ID_SYNC_TIME_TQ, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "prbs_checker.");
    if (cli_parm != NULL)
    {
        bcmolt_prbs_checker_config val = { };
        cli_parm = bcmcli_find_named_parm(session, "prbs_checker.polynom");
        if (cli_parm != NULL)
        {
            val.polynom = (bcmolt_prbs_polynomial) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "prbs_checker.polynom is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "prbs_checker.mode");
        if (cli_parm != NULL)
        {
            val.mode = (bcmolt_prbs_checker_mode) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "prbs_checker.mode is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "prbs_checker.data_invert");
        if (cli_parm != NULL)
        {
            val.data_invert = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "prbs_checker.data_invert is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "prbs_checker.control");
        if (cli_parm != NULL)
        {
            val.control = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "prbs_checker.control is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_path_1g_us, prbs_checker, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_prbs_checker_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_1G_US, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_PATH_1G_US_CFG_ID_PRBS_CHECKER, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_path_1g_us, prbs_checker, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_cfg_set(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_set(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_path_1g_us_cfg_clear(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_path_1g_us_cfg cfg;         /**< declare main API struct */
    bcmolt_epon_path_1g_us_key key = { };   /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_path_1g_us_cfg cfg;\n");
    bcmcli_log("bcmolt_epon_path_1g_us_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_clear");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_1G_US, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_PATH_1G_US_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, epon_path_1g_us, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, epon_path_1g_us, key);\n");

    /* call API */
    err = bcmolt_cfg_clear(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_clear(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_path_1g_us_cfg_get_multi(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_path_1g_us_cfg cfg;         /**< declare main API struct */
    bcmolt_epon_path_1g_us_key key = { };   /**< declare key */
    bcmolt_msg_set *msg_set = NULL;         /**< declare message set */
    uint32_t max_msgs;                      /**< declare max number of msgs to get */
    bcmos_bool invert_filter;               /**< declare filter invert flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_path_1g_us_cfg cfg;\n");
    bcmcli_log("bcmolt_epon_path_1g_us_key key = {  };\n");
    bcmcli_log("bcmolt_msg_set* msg_set = NULL;\n");
    bcmcli_log("uint32_t max_msgs;\n");
    bcmcli_log("bcmos_bool invert_filter;\n");
    apicli_print_start(session, "bcmolt_cfg_get_multi");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_1G_US, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_PATH_1G_US_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");

    /* set max number of msgs from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "max_msgs");
    if (cli_parm != NULL)
    {
        max_msgs = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "max_msgs is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("max_msgs = %d;\n", max_msgs);

    /* set filter invert flag from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "filter_invert");
    if (cli_parm != NULL)
    {
        invert_filter = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "filter_invert is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("invert_filter = %s;\n", (invert_filter) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* allocate message set */
    err = apicli_msg_set_alloc(byte_pool, BCMOLT_OBJ_ID_EPON_PATH_1G_US, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);
    if (err != BCM_ERR_OK)
    {
        return err;
    }

    bcmcli_log("bcmolt_msg_set_alloc(BCMOLT_OBJ_ID_EPON_PATH_1G_US, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, epon_path_1g_us, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, epon_path_1g_us, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "filter.default_fec_state");
    if (cli_parm != NULL)
    {
        bcmolt_epon_fec_en_state val;
        val = (bcmolt_epon_fec_en_state) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, epon_path_1g_us, default_fec_state, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_path_1g_us, default_fec_state, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_1G_US, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_PATH_1G_US_CFG_ID_DEFAULT_FEC_STATE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "default_fec_state");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_path_1g_us, default_fec_state);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_path_1g_us, default_fec_state);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.sync_time_tq");
    if (cli_parm != NULL)
    {
        bcmolt_time_quanta val;
        val = (bcmolt_time_quanta) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, epon_path_1g_us, sync_time_tq, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_path_1g_us, sync_time_tq, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_1G_US, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_PATH_1G_US_CFG_ID_SYNC_TIME_TQ, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "sync_time_tq");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_path_1g_us, sync_time_tq);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_path_1g_us, sync_time_tq);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.prbs_checker.");
    if (cli_parm != NULL)
    {
        bcmolt_prbs_checker_config val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_checker.polynom");
        if (cli_parm != NULL)
        {
            val.polynom = (bcmolt_prbs_polynomial) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_checker.polynom is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_checker.mode");
        if (cli_parm != NULL)
        {
            val.mode = (bcmolt_prbs_checker_mode) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_checker.mode is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_checker.data_invert");
        if (cli_parm != NULL)
        {
            val.data_invert = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_checker.data_invert is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_checker.control");
        if (cli_parm != NULL)
        {
            val.control = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_checker.control is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_path_1g_us, prbs_checker, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_prbs_checker_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_1G_US, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_PATH_1G_US_CFG_ID_PRBS_CHECKER, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_path_1g_us, prbs_checker, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "prbs_checker");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_path_1g_us, prbs_checker);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_path_1g_us, prbs_checker);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.prbs_status.");
    if (cli_parm != NULL)
    {
        bcmolt_prbs_status val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_status.lock_state");
        if (cli_parm != NULL)
        {
            val.lock_state = (bcmolt_prbs_lock_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_status.lock_state is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_status.error_counts");
        if (cli_parm != NULL)
        {
            val.error_counts = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_status.error_counts is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_path_1g_us, prbs_status, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_prbs_status val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_1G_US, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_PATH_1G_US_CFG_ID_PRBS_STATUS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_path_1g_us, prbs_status, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "prbs_status");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_path_1g_us, prbs_status);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_path_1g_us, prbs_status);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_path_1g_us, default_fec_state) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_path_1g_us, sync_time_tq) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_path_1g_us, prbs_checker) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_path_1g_us, prbs_status))
    {
        BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_path_1g_us, all_properties);
        bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_path_1g_us, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);
    bcmcli_log("bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_path_1g_us_stat_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_path_1g_us_stat stat;       /**< declare main API struct */
    bcmolt_epon_path_1g_us_key key = { };   /**< declare key */
    bcmos_bool clear_on_read;               /**< declare 'clear on read' flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_path_1g_us_stat stat;\n");
    bcmcli_log("bcmolt_epon_path_1g_us_key key = {  };\n");
    bcmcli_log("bcmos_bool clear_on_read;\n");
    apicli_print_start(session, "bcmolt_stat_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_1G_US, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_PATH_1G_US_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");

    /* set stat flags from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "clear");
    if (cli_parm != NULL)
    {
        clear_on_read = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "clear is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("clear_on_read = %s;\n", (clear_on_read) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* init the API struct */
    BCMOLT_STAT_INIT(&stat, epon_path_1g_us, key);
    bcmcli_log("BCMOLT_STAT_INIT(&stat, epon_path_1g_us, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "bytes");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, bytes);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, bytes);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_64");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, frames_64);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, frames_64);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_65_127");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, frames_65_127);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, frames_65_127);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_128_255");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, frames_128_255);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, frames_128_255);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_256_511");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, frames_256_511);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, frames_256_511);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_512_1023");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, frames_512_1023);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, frames_512_1023);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_1024_1518");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, frames_1024_1518);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, frames_1024_1518);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_1519_2047");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, frames_1519_2047);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, frames_1519_2047);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_2048_4095");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, frames_2048_4095);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, frames_2048_4095);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_4096_9216");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, frames_4096_9216);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, frames_4096_9216);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "frames_9217_16383");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, frames_9217_16383);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, frames_9217_16383);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "broadcast_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, broadcast_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, broadcast_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "data_bytes");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, data_bytes);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, data_bytes);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "multicast_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, multicast_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, multicast_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "unicast_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, unicast_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, unicast_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "mpcp_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, mpcp_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, mpcp_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "oam_bytes");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, oam_bytes);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, oam_bytes);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "oam_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, oam_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, oam_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "report_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, report_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, report_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "abort_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, abort_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, abort_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "fcs_error");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, fcs_error);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, fcs_error);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "crc_8_error");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, crc_8_error);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, crc_8_error);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "out_of_slot");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, out_of_slot);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, out_of_slot);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "oversize_error");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, oversize_error);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, oversize_error);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "runt_error");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, runt_error);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, runt_error);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_us, bytes) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_us, frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_us, frames_64) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_us, frames_65_127) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_us, frames_128_255) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_us, frames_256_511) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_us, frames_512_1023) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_us, frames_1024_1518) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_us, frames_1519_2047) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_us, frames_2048_4095) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_us, frames_4096_9216) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_us, frames_9217_16383) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_us, broadcast_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_us, data_bytes) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_us, multicast_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_us, unicast_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_us, mpcp_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_us, oam_bytes) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_us, oam_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_us, report_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_us, abort_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_us, fcs_error) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_us, crc_8_error) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_us, out_of_slot) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_us, oversize_error) && !BCMOLT_STAT_PROP_IS_SET(&stat, epon_path_1g_us, runt_error))
    {
        BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, all_properties);
        bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, epon_path_1g_us, all_properties);\n");
    }

    /* call API */
    err = bcmolt_stat_get(device_id, &stat.hdr, clear_on_read);
    bcmcli_log("bcmolt_stat_get(device_id, &stat.hdr, clear_on_read);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &stat.hdr.hdr);
    }

    apicli_print_complete(session, err, stat.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_path_1g_us_stat_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_path_1g_us_stat_cfg stat_cfg;   /**< declare main API struct */
    bcmolt_epon_path_1g_us_key key = { };       /**< declare key */
    bcmolt_epon_path_1g_us_stat_id stat_id;     /**< declare stat ID */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_path_1g_us_stat_cfg stat_cfg;\n");
    bcmcli_log("bcmolt_epon_path_1g_us_key key = {  };\n");
    apicli_print_start(session, "bcmolt_stat_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_1G_US, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_PATH_1G_US_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");

    /* set stat ID from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "sub");
    if (cli_parm != NULL)
    {
        stat_id = (bcmolt_epon_path_1g_us_stat_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
        return BCM_ERR_PARM;
    }

    /* init the API struct */
    switch (stat_id)
    {
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, bytes, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_64:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, frames_64, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, frames_64, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_65_127:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, frames_65_127, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, frames_65_127, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_128_255:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, frames_128_255, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, frames_128_255, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_256_511:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, frames_256_511, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, frames_256_511, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_512_1023:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, frames_512_1023, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, frames_512_1023, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_1024_1518:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, frames_1024_1518, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, frames_1024_1518, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_1519_2047:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, frames_1519_2047, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, frames_1519_2047, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_2048_4095:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, frames_2048_4095, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, frames_2048_4095, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_4096_9216:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, frames_4096_9216, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, frames_4096_9216, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_9217_16383:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, frames_9217_16383, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, frames_9217_16383, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_BROADCAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, broadcast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, broadcast_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_DATA_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, data_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, data_bytes, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_MULTICAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, multicast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, multicast_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_UNICAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, unicast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, unicast_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_MPCP_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, mpcp_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, mpcp_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_OAM_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, oam_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, oam_bytes, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_OAM_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, oam_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, oam_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_REPORT_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, report_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, report_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_ABORT_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, abort_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, abort_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_FCS_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, fcs_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, fcs_error, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_CRC_8_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, crc_8_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, crc_8_error, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_OUT_OF_SLOT:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, out_of_slot, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, out_of_slot, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_OVERSIZE_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, oversize_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, oversize_error, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_RUNT_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, runt_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, runt_error, key);\n");
            break;
        default:
            apicli_print_complete(session, BCM_ERR_RANGE, "\n");
            return BCM_ERR_RANGE;
    }

    /* call API */
    err = bcmolt_stat_cfg_get(device_id, &stat_cfg.hdr);
    bcmcli_log("bcmolt_stat_cfg_get(device_id, &stat_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &stat_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, stat_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_path_1g_us_stat_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_path_1g_us_stat_cfg stat_cfg;   /**< declare main API struct */
    bcmolt_epon_path_1g_us_key key = { };       /**< declare key */
    bcmolt_epon_path_1g_us_stat_id stat_id;     /**< declare stat ID */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_path_1g_us_stat_cfg stat_cfg;\n");
    bcmcli_log("bcmolt_epon_path_1g_us_key key = {  };\n");
    apicli_print_start(session, "bcmolt_stat_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_1G_US, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_PATH_1G_US_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");

    /* set stat ID from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "sub");
    if (cli_parm != NULL)
    {
        stat_id = (bcmolt_epon_path_1g_us_stat_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
        return BCM_ERR_PARM;
    }

    /* init the API struct */
    switch (stat_id)
    {
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, bytes, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_64:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, frames_64, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, frames_64, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_65_127:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, frames_65_127, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, frames_65_127, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_128_255:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, frames_128_255, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, frames_128_255, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_256_511:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, frames_256_511, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, frames_256_511, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_512_1023:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, frames_512_1023, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, frames_512_1023, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_1024_1518:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, frames_1024_1518, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, frames_1024_1518, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_1519_2047:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, frames_1519_2047, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, frames_1519_2047, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_2048_4095:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, frames_2048_4095, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, frames_2048_4095, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_4096_9216:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, frames_4096_9216, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, frames_4096_9216, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_9217_16383:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, frames_9217_16383, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, frames_9217_16383, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_BROADCAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, broadcast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, broadcast_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_DATA_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, data_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, data_bytes, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_MULTICAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, multicast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, multicast_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_UNICAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, unicast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, unicast_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_MPCP_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, mpcp_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, mpcp_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_OAM_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, oam_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, oam_bytes, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_OAM_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, oam_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, oam_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_REPORT_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, report_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, report_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_ABORT_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, abort_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, abort_frames, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_FCS_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, fcs_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, fcs_error, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_CRC_8_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, crc_8_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, crc_8_error, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_OUT_OF_SLOT:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, out_of_slot, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, out_of_slot, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_OVERSIZE_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, oversize_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, oversize_error, key);\n");
            break;
        case BCMOLT_EPON_PATH_1G_US_STAT_ID_RUNT_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, runt_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, epon_path_1g_us, runt_error, key);\n");
            break;
        default:
            apicli_print_complete(session, BCM_ERR_RANGE, "\n");
            return BCM_ERR_RANGE;
    }

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.");
    if (cli_parm != NULL)
    {
        bcmolt_stat_alarm_config val = { };
        cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.trigger.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.type");
            if (cli_parm != NULL)
            {
                val.trigger.type = (bcmolt_stat_condition_type) cli_parm->value.enum_val;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.type is not set\n");
                return BCM_ERR_PARM;
            }

            switch (val.trigger.type)
            {
                case BCMOLT_STAT_CONDITION_TYPE_RATE_THRESHOLD:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.rising");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_threshold.rising = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.rising is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.falling");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_threshold.falling = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.falling is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_RATE_RANGE:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.upper");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_range.upper = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.upper is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.lower");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_range.lower = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.lower is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_VALUE_THRESHOLD:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.limit");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.value_threshold.limit = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.limit is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_NONE:
                    break;
                default:
                    apicli_print_complete(session, BCM_ERR_RANGE, "\n");
                    return BCM_ERR_RANGE;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.soak.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "cfg.soak.active_soak_time");
            if (cli_parm != NULL)
            {
                val.soak.active_soak_time = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak.active_soak_time is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "cfg.soak.clear_soak_time");
            if (cli_parm != NULL)
            {
                val.soak.clear_soak_time = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak.clear_soak_time is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_STAT_CFG_PROP_SET(&stat_cfg, epon_path_1g_us, cfg, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_stat_alarm_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_1G_US, BCMOLT_MGT_GROUP_STAT_CFG, 0, BCMOLT_EPON_PATH_1G_US_STAT_CFG_ID_CFG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_STAT_CFG_PROP_SET(&stat_cfg, epon_path_1g_us, cfg, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_stat_cfg_set(device_id, &stat_cfg.hdr);
    bcmcli_log("bcmolt_stat_cfg_set(device_id, &stat_cfg.hdr);\n");
    apicli_print_complete(session, err, stat_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_path_1g_us_auto_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_path_1g_us_auto_cfg auto_cfg;   /**< declare main API struct */
    bcmolt_epon_path_1g_us_key key = { };       /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_path_1g_us_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_epon_path_1g_us_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_get");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, epon_path_1g_us, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, epon_path_1g_us, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_cleared");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_path_1g_us, stat_alarm_cleared);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_path_1g_us, stat_alarm_cleared);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_raised");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_path_1g_us, stat_alarm_raised);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_path_1g_us, stat_alarm_raised);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_path_1g_us, stat_alarm_cleared) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, epon_path_1g_us, stat_alarm_raised))
    {
        BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_path_1g_us, all_properties);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, epon_path_1g_us, all_properties);\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &auto_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_path_1g_us_auto_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_path_1g_us_auto_cfg auto_cfg;   /**< declare main API struct */
    bcmolt_epon_path_1g_us_key key = { };       /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_path_1g_us_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_epon_path_1g_us_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_set");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, epon_path_1g_us, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, epon_path_1g_us, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_cleared");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_path_1g_us, stat_alarm_cleared, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_path_1g_us, stat_alarm_cleared, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_1G_US, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_PATH_1G_US_AUTO_CFG_ID_STAT_ALARM_CLEARED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_raised");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_path_1g_us, stat_alarm_raised, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, epon_path_1g_us, stat_alarm_raised, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_PATH_1G_US, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_EPON_PATH_1G_US_AUTO_CFG_ID_STAT_ALARM_RAISED, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);\n");
    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_rp_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_rp_cfg cfg;         /**< declare main API struct */
    bcmolt_epon_rp_key key = { };   /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_rp_cfg cfg;\n");
    bcmcli_log("bcmolt_epon_rp_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_RP, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_RP_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "link_rate");
    if (cli_parm != NULL)
    {
        key.link_rate = (bcmolt_epon_link_rate) cli_parm->value.enum_val;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "link_rate is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.link_rate = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_RP, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_RP_KEY_ID_LINK_RATE, &key.link_rate);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, epon_rp, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, epon_rp, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "base_llid");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_rp, base_llid);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_rp, base_llid);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "mpcp_disc_en");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_rp, mpcp_disc_en);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_rp, mpcp_disc_en);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "mpcp_disc_gnt_len_tq");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_rp, mpcp_disc_gnt_len_tq);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_rp, mpcp_disc_gnt_len_tq);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "mpcp_report_timeout");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_rp, mpcp_report_timeout);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_rp, mpcp_report_timeout);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "max_mpcp_reg_per_disc_window");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_rp, max_mpcp_reg_per_disc_window);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_rp, max_mpcp_reg_per_disc_window);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "max_links");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_rp, max_links);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_rp, max_links);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "default_upstream_bandwidth");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_rp, default_upstream_bandwidth);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_rp, default_upstream_bandwidth);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rate_of_refraction");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, epon_rp, rate_of_refraction);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_rp, rate_of_refraction);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_CFG_PROP_IS_SET(&cfg, epon_rp, base_llid) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_rp, mpcp_disc_en) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_rp, mpcp_disc_gnt_len_tq) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_rp, mpcp_report_timeout) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_rp, max_mpcp_reg_per_disc_window) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_rp, max_links) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_rp, default_upstream_bandwidth) && !BCMOLT_CFG_PROP_IS_SET(&cfg, epon_rp, rate_of_refraction))
    {
        BCMOLT_CFG_PROP_GET(&cfg, epon_rp, all_properties);
        bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, epon_rp, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_get(device_id, &cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_rp_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_rp_cfg cfg;         /**< declare main API struct */
    bcmolt_epon_rp_key key = { };   /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_rp_cfg cfg;\n");
    bcmcli_log("bcmolt_epon_rp_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_RP, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_RP_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "link_rate");
    if (cli_parm != NULL)
    {
        key.link_rate = (bcmolt_epon_link_rate) cli_parm->value.enum_val;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "link_rate is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.link_rate = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_RP, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_RP_KEY_ID_LINK_RATE, &key.link_rate);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, epon_rp, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, epon_rp, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "base_llid");
    if (cli_parm != NULL)
    {
        bcmolt_epon_llid val;
        val = (bcmolt_epon_llid) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, epon_rp, base_llid, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_rp, base_llid, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_RP, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_RP_CFG_ID_BASE_LLID, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "mpcp_disc_en");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, epon_rp, mpcp_disc_en, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_rp, mpcp_disc_en, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_RP, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_RP_CFG_ID_MPCP_DISC_EN, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "mpcp_disc_gnt_len_tq");
    if (cli_parm != NULL)
    {
        bcmolt_time_quanta val;
        val = (bcmolt_time_quanta) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, epon_rp, mpcp_disc_gnt_len_tq, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_rp, mpcp_disc_gnt_len_tq, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_RP, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_RP_CFG_ID_MPCP_DISC_GNT_LEN_TQ, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "mpcp_report_timeout");
    if (cli_parm != NULL)
    {
        uint16_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, epon_rp, mpcp_report_timeout, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_rp, mpcp_report_timeout, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_RP, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_RP_CFG_ID_MPCP_REPORT_TIMEOUT, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "max_mpcp_reg_per_disc_window");
    if (cli_parm != NULL)
    {
        uint16_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, epon_rp, max_mpcp_reg_per_disc_window, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_rp, max_mpcp_reg_per_disc_window, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_RP, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_RP_CFG_ID_MAX_MPCP_REG_PER_DISC_WINDOW, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "max_links");
    if (cli_parm != NULL)
    {
        uint16_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, epon_rp, max_links, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_rp, max_links, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_RP, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_RP_CFG_ID_MAX_LINKS, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "default_upstream_bandwidth.");
    if (cli_parm != NULL)
    {
        bcmolt_upstream_bandwidth_distribution val = { };
        cli_parm = bcmcli_find_named_parm(session, "default_upstream_bandwidth.polling_interval_us");
        if (cli_parm != NULL)
        {
            val.polling_interval_us = (bcmolt_polling_interval) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "default_upstream_bandwidth.polling_interval_us is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "default_upstream_bandwidth.grant_threshold_tq");
        if (cli_parm != NULL)
        {
            val.grant_threshold_tq = (bcmolt_time_quanta) cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "default_upstream_bandwidth.grant_threshold_tq is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "default_upstream_bandwidth.min_schedulershaper.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "default_upstream_bandwidth.min_schedulershaper.bandwidth_Kbps");
            if (cli_parm != NULL)
            {
                val.min_schedulershaper.bandwidth_Kbps = (bcmolt_bandwidth_Kbps) cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "default_upstream_bandwidth.min_schedulershaper.bandwidth_Kbps is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "default_upstream_bandwidth.min_schedulershaper.max_burst_size_tq");
            if (cli_parm != NULL)
            {
                val.min_schedulershaper.max_burst_size_tq = (bcmolt_time_quanta) cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "default_upstream_bandwidth.min_schedulershaper.max_burst_size_tq is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "default_upstream_bandwidth.min_schedulershaper.priority");
            if (cli_parm != NULL)
            {
                val.min_schedulershaper.priority = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "default_upstream_bandwidth.min_schedulershaper.priority is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "default_upstream_bandwidth.min_schedulershaper.weight_tq");
            if (cli_parm != NULL)
            {
                val.min_schedulershaper.weight_tq = (bcmolt_time_quanta) cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "default_upstream_bandwidth.min_schedulershaper.weight_tq is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "default_upstream_bandwidth.min_schedulershaper is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "default_upstream_bandwidth.max_schedulershaper.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "default_upstream_bandwidth.max_schedulershaper.bandwidth_Kbps");
            if (cli_parm != NULL)
            {
                val.max_schedulershaper.bandwidth_Kbps = (bcmolt_bandwidth_Kbps) cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "default_upstream_bandwidth.max_schedulershaper.bandwidth_Kbps is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "default_upstream_bandwidth.max_schedulershaper.max_burst_size_tq");
            if (cli_parm != NULL)
            {
                val.max_schedulershaper.max_burst_size_tq = (bcmolt_time_quanta) cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "default_upstream_bandwidth.max_schedulershaper.max_burst_size_tq is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "default_upstream_bandwidth.max_schedulershaper.priority");
            if (cli_parm != NULL)
            {
                val.max_schedulershaper.priority = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "default_upstream_bandwidth.max_schedulershaper.priority is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "default_upstream_bandwidth.max_schedulershaper.weight_tq");
            if (cli_parm != NULL)
            {
                val.max_schedulershaper.weight_tq = (bcmolt_time_quanta) cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "default_upstream_bandwidth.max_schedulershaper.weight_tq is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "default_upstream_bandwidth.max_schedulershaper is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "default_upstream_bandwidth.tdm_grant_size_tq");
        if (cli_parm != NULL)
        {
            val.tdm_grant_size_tq = (bcmolt_time_quanta) cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "default_upstream_bandwidth.tdm_grant_size_tq is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "default_upstream_bandwidth.tdm_grant_interval_us");
        if (cli_parm != NULL)
        {
            val.tdm_grant_interval_us = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "default_upstream_bandwidth.tdm_grant_interval_us is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_rp, default_upstream_bandwidth, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_upstream_bandwidth_distribution val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_RP, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_RP_CFG_ID_DEFAULT_UPSTREAM_BANDWIDTH, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_rp, default_upstream_bandwidth, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rate_of_refraction");
    if (cli_parm != NULL)
    {
        double val;
        val = cli_parm->value.d;
        BCMOLT_CFG_PROP_SET(&cfg, epon_rp, rate_of_refraction, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_rp, rate_of_refraction, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_RP, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_RP_CFG_ID_RATE_OF_REFRACTION, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_cfg_set(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_set(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_rp_cfg_clear(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_rp_cfg cfg;         /**< declare main API struct */
    bcmolt_epon_rp_key key = { };   /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_rp_cfg cfg;\n");
    bcmcli_log("bcmolt_epon_rp_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_clear");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_RP, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_RP_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "link_rate");
    if (cli_parm != NULL)
    {
        key.link_rate = (bcmolt_epon_link_rate) cli_parm->value.enum_val;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "link_rate is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.link_rate = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_RP, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_RP_KEY_ID_LINK_RATE, &key.link_rate);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, epon_rp, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, epon_rp, key);\n");

    /* call API */
    err = bcmolt_cfg_clear(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_clear(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_epon_rp_cfg_get_multi(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_epon_rp_cfg cfg;         /**< declare main API struct */
    bcmolt_epon_rp_key key = { };   /**< declare key */
    bcmolt_msg_set *msg_set = NULL; /**< declare message set */
    uint32_t max_msgs;              /**< declare max number of msgs to get */
    bcmos_bool invert_filter;       /**< declare filter invert flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_epon_rp_cfg cfg;\n");
    bcmcli_log("bcmolt_epon_rp_key key = {  };\n");
    bcmcli_log("bcmolt_msg_set* msg_set = NULL;\n");
    bcmcli_log("uint32_t max_msgs;\n");
    bcmcli_log("bcmos_bool invert_filter;\n");
    apicli_print_start(session, "bcmolt_cfg_get_multi");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "epon_ni");
    if (cli_parm != NULL)
    {
        key.epon_ni = (bcmolt_epon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "epon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.epon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_RP, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_RP_KEY_ID_EPON_NI, &key.epon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "link_rate");
    if (cli_parm != NULL)
    {
        key.link_rate = (bcmolt_epon_link_rate) cli_parm->value.enum_val;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "link_rate is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.link_rate = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_RP, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_EPON_RP_KEY_ID_LINK_RATE, &key.link_rate);
    bcmcli_log(";\n");

    /* set max number of msgs from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "max_msgs");
    if (cli_parm != NULL)
    {
        max_msgs = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "max_msgs is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("max_msgs = %d;\n", max_msgs);

    /* set filter invert flag from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "filter_invert");
    if (cli_parm != NULL)
    {
        invert_filter = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "filter_invert is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("invert_filter = %s;\n", (invert_filter) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* allocate message set */
    err = apicli_msg_set_alloc(byte_pool, BCMOLT_OBJ_ID_EPON_RP, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);
    if (err != BCM_ERR_OK)
    {
        return err;
    }

    bcmcli_log("bcmolt_msg_set_alloc(BCMOLT_OBJ_ID_EPON_RP, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, epon_rp, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, epon_rp, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "filter.base_llid");
    if (cli_parm != NULL)
    {
        bcmolt_epon_llid val;
        val = (bcmolt_epon_llid) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, epon_rp, base_llid, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_rp, base_llid, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_RP, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_RP_CFG_ID_BASE_LLID, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "base_llid");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_rp, base_llid);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_rp, base_llid);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.mpcp_disc_en");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, epon_rp, mpcp_disc_en, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_rp, mpcp_disc_en, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_RP, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_RP_CFG_ID_MPCP_DISC_EN, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "mpcp_disc_en");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_rp, mpcp_disc_en);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_rp, mpcp_disc_en);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.mpcp_disc_gnt_len_tq");
    if (cli_parm != NULL)
    {
        bcmolt_time_quanta val;
        val = (bcmolt_time_quanta) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, epon_rp, mpcp_disc_gnt_len_tq, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_rp, mpcp_disc_gnt_len_tq, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_RP, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_RP_CFG_ID_MPCP_DISC_GNT_LEN_TQ, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "mpcp_disc_gnt_len_tq");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_rp, mpcp_disc_gnt_len_tq);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_rp, mpcp_disc_gnt_len_tq);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.mpcp_report_timeout");
    if (cli_parm != NULL)
    {
        uint16_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, epon_rp, mpcp_report_timeout, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_rp, mpcp_report_timeout, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_RP, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_RP_CFG_ID_MPCP_REPORT_TIMEOUT, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "mpcp_report_timeout");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_rp, mpcp_report_timeout);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_rp, mpcp_report_timeout);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.max_mpcp_reg_per_disc_window");
    if (cli_parm != NULL)
    {
        uint16_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, epon_rp, max_mpcp_reg_per_disc_window, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_rp, max_mpcp_reg_per_disc_window, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_RP, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_RP_CFG_ID_MAX_MPCP_REG_PER_DISC_WINDOW, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "max_mpcp_reg_per_disc_window");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_rp, max_mpcp_reg_per_disc_window);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_rp, max_mpcp_reg_per_disc_window);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.max_links");
    if (cli_parm != NULL)
    {
        uint16_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, epon_rp, max_links, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_rp, max_links, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_RP, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_RP_CFG_ID_MAX_LINKS, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "max_links");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_rp, max_links);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_rp, max_links);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.default_upstream_bandwidth.");
    if (cli_parm != NULL)
    {
        bcmolt_upstream_bandwidth_distribution val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.default_upstream_bandwidth.polling_interval_us");
        if (cli_parm != NULL)
        {
            val.polling_interval_us = (bcmolt_polling_interval) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.default_upstream_bandwidth.polling_interval_us is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.default_upstream_bandwidth.grant_threshold_tq");
        if (cli_parm != NULL)
        {
            val.grant_threshold_tq = (bcmolt_time_quanta) cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.default_upstream_bandwidth.grant_threshold_tq is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "filter.default_upstream_bandwidth.min_schedulershaper.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "filter.default_upstream_bandwidth.min_schedulershaper.bandwidth_Kbps");
            if (cli_parm != NULL)
            {
                val.min_schedulershaper.bandwidth_Kbps = (bcmolt_bandwidth_Kbps) cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.default_upstream_bandwidth.min_schedulershaper.bandwidth_Kbps is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.default_upstream_bandwidth.min_schedulershaper.max_burst_size_tq");
            if (cli_parm != NULL)
            {
                val.min_schedulershaper.max_burst_size_tq = (bcmolt_time_quanta) cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.default_upstream_bandwidth.min_schedulershaper.max_burst_size_tq is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.default_upstream_bandwidth.min_schedulershaper.priority");
            if (cli_parm != NULL)
            {
                val.min_schedulershaper.priority = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.default_upstream_bandwidth.min_schedulershaper.priority is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.default_upstream_bandwidth.min_schedulershaper.weight_tq");
            if (cli_parm != NULL)
            {
                val.min_schedulershaper.weight_tq = (bcmolt_time_quanta) cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.default_upstream_bandwidth.min_schedulershaper.weight_tq is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.default_upstream_bandwidth.min_schedulershaper is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "filter.default_upstream_bandwidth.max_schedulershaper.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "filter.default_upstream_bandwidth.max_schedulershaper.bandwidth_Kbps");
            if (cli_parm != NULL)
            {
                val.max_schedulershaper.bandwidth_Kbps = (bcmolt_bandwidth_Kbps) cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.default_upstream_bandwidth.max_schedulershaper.bandwidth_Kbps is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.default_upstream_bandwidth.max_schedulershaper.max_burst_size_tq");
            if (cli_parm != NULL)
            {
                val.max_schedulershaper.max_burst_size_tq = (bcmolt_time_quanta) cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.default_upstream_bandwidth.max_schedulershaper.max_burst_size_tq is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.default_upstream_bandwidth.max_schedulershaper.priority");
            if (cli_parm != NULL)
            {
                val.max_schedulershaper.priority = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.default_upstream_bandwidth.max_schedulershaper.priority is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.default_upstream_bandwidth.max_schedulershaper.weight_tq");
            if (cli_parm != NULL)
            {
                val.max_schedulershaper.weight_tq = (bcmolt_time_quanta) cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.default_upstream_bandwidth.max_schedulershaper.weight_tq is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.default_upstream_bandwidth.max_schedulershaper is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.default_upstream_bandwidth.tdm_grant_size_tq");
        if (cli_parm != NULL)
        {
            val.tdm_grant_size_tq = (bcmolt_time_quanta) cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.default_upstream_bandwidth.tdm_grant_size_tq is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.default_upstream_bandwidth.tdm_grant_interval_us");
        if (cli_parm != NULL)
        {
            val.tdm_grant_interval_us = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.default_upstream_bandwidth.tdm_grant_interval_us is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, epon_rp, default_upstream_bandwidth, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_upstream_bandwidth_distribution val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_RP, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_RP_CFG_ID_DEFAULT_UPSTREAM_BANDWIDTH, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_rp, default_upstream_bandwidth, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "default_upstream_bandwidth");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_rp, default_upstream_bandwidth);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_rp, default_upstream_bandwidth);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.rate_of_refraction");
    if (cli_parm != NULL)
    {
        double val;
        val = cli_parm->value.d;
        BCMOLT_CFG_PROP_SET(&cfg, epon_rp, rate_of_refraction, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, epon_rp, rate_of_refraction, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_EPON_RP, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_EPON_RP_CFG_ID_RATE_OF_REFRACTION, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rate_of_refraction");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_rp, rate_of_refraction);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_rp, rate_of_refraction);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_rp, base_llid) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_rp, mpcp_disc_en) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_rp, mpcp_disc_gnt_len_tq) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_rp, mpcp_report_timeout) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_rp, max_mpcp_reg_per_disc_window) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_rp, max_links) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_rp, default_upstream_bandwidth) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, epon_rp, rate_of_refraction))
    {
        BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_rp, all_properties);
        bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, epon_rp, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);
    bcmcli_log("bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpio_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpio_cfg cfg;        /**< declare main API struct */
    bcmolt_gpio_key key = { };  /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpio_cfg cfg;\n");
    bcmcli_log("bcmolt_gpio_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "gpio_id");
    if (cli_parm != NULL)
    {
        key.gpio_id = (bcmolt_gpio_pin) cli_parm->value.enum_val;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "gpio_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.gpio_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPIO, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPIO_KEY_ID_GPIO_ID, &key.gpio_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, gpio, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, gpio, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "direction");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpio, direction);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpio, direction);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "value");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpio, value);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpio, value);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_CFG_PROP_IS_SET(&cfg, gpio, direction) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpio, value))
    {
        BCMOLT_CFG_PROP_GET(&cfg, gpio, all_properties);
        bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpio, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_get(device_id, &cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpio_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpio_cfg cfg;        /**< declare main API struct */
    bcmolt_gpio_key key = { };  /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpio_cfg cfg;\n");
    bcmcli_log("bcmolt_gpio_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "gpio_id");
    if (cli_parm != NULL)
    {
        key.gpio_id = (bcmolt_gpio_pin) cli_parm->value.enum_val;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "gpio_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.gpio_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPIO, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPIO_KEY_ID_GPIO_ID, &key.gpio_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, gpio, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, gpio, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "direction");
    if (cli_parm != NULL)
    {
        bcmolt_gpio_pin_dir val;
        val = (bcmolt_gpio_pin_dir) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, gpio, direction, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpio, direction, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPIO, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPIO_CFG_ID_DIRECTION, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "value");
    if (cli_parm != NULL)
    {
        bcmolt_gpio_value val;
        val = (bcmolt_gpio_value) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, gpio, value, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpio, value, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPIO, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPIO_CFG_ID_VALUE, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_cfg_set(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_set(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpio_cfg_clear(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpio_cfg cfg;        /**< declare main API struct */
    bcmolt_gpio_key key = { };  /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpio_cfg cfg;\n");
    bcmcli_log("bcmolt_gpio_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_clear");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "gpio_id");
    if (cli_parm != NULL)
    {
        key.gpio_id = (bcmolt_gpio_pin) cli_parm->value.enum_val;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "gpio_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.gpio_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPIO, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPIO_KEY_ID_GPIO_ID, &key.gpio_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, gpio, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, gpio, key);\n");

    /* call API */
    err = bcmolt_cfg_clear(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_clear(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpio_cfg_get_multi(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpio_cfg cfg;            /**< declare main API struct */
    bcmolt_gpio_key key = { };      /**< declare key */
    bcmolt_msg_set *msg_set = NULL; /**< declare message set */
    uint32_t max_msgs;              /**< declare max number of msgs to get */
    bcmos_bool invert_filter;       /**< declare filter invert flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpio_cfg cfg;\n");
    bcmcli_log("bcmolt_gpio_key key = {  };\n");
    bcmcli_log("bcmolt_msg_set* msg_set = NULL;\n");
    bcmcli_log("uint32_t max_msgs;\n");
    bcmcli_log("bcmos_bool invert_filter;\n");
    apicli_print_start(session, "bcmolt_cfg_get_multi");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "gpio_id");
    if (cli_parm != NULL)
    {
        key.gpio_id = (bcmolt_gpio_pin) cli_parm->value.enum_val;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "gpio_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.gpio_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPIO, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPIO_KEY_ID_GPIO_ID, &key.gpio_id);
    bcmcli_log(";\n");

    /* set max number of msgs from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "max_msgs");
    if (cli_parm != NULL)
    {
        max_msgs = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "max_msgs is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("max_msgs = %d;\n", max_msgs);

    /* set filter invert flag from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "filter_invert");
    if (cli_parm != NULL)
    {
        invert_filter = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "filter_invert is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("invert_filter = %s;\n", (invert_filter) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* allocate message set */
    err = apicli_msg_set_alloc(byte_pool, BCMOLT_OBJ_ID_GPIO, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);
    if (err != BCM_ERR_OK)
    {
        return err;
    }

    bcmcli_log("bcmolt_msg_set_alloc(BCMOLT_OBJ_ID_GPIO, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, gpio, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, gpio, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "filter.direction");
    if (cli_parm != NULL)
    {
        bcmolt_gpio_pin_dir val;
        val = (bcmolt_gpio_pin_dir) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, gpio, direction, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpio, direction, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPIO, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPIO_CFG_ID_DIRECTION, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "direction");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpio, direction);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpio, direction);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.value");
    if (cli_parm != NULL)
    {
        bcmolt_gpio_value val;
        val = (bcmolt_gpio_value) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, gpio, value, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpio, value, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPIO, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPIO_CFG_ID_VALUE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "value");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpio, value);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpio, value);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpio, direction) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpio, value))
    {
        BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpio, all_properties);
        bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpio, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);
    bcmcli_log("bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_alloc_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_alloc_cfg cfg;          /**< declare main API struct */
    bcmolt_gpon_alloc_key key = { };    /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_alloc_cfg cfg;\n");
    bcmcli_log("bcmolt_gpon_alloc_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ALLOC, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_ALLOC_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "alloc_id");
    if (cli_parm != NULL)
    {
        key.alloc_id = (bcmolt_gpon_alloc_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "alloc_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.alloc_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ALLOC, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_ALLOC_KEY_ID_ALLOC_ID, &key.alloc_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, gpon_alloc, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, gpon_alloc, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "state");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_alloc, state);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_alloc, state);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "sla");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_alloc, sla);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_alloc, sla);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_alloc, onu_id);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_alloc, onu_id);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "collect_stats");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_alloc, collect_stats);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_alloc, collect_stats);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_alloc, state) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_alloc, sla) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_alloc, onu_id) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_alloc, collect_stats))
    {
        BCMOLT_CFG_PROP_GET(&cfg, gpon_alloc, all_properties);
        bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_alloc, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_get(device_id, &cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_alloc_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_alloc_cfg cfg;          /**< declare main API struct */
    bcmolt_gpon_alloc_key key = { };    /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_alloc_cfg cfg;\n");
    bcmcli_log("bcmolt_gpon_alloc_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ALLOC, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_ALLOC_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "alloc_id");
    if (cli_parm != NULL)
    {
        key.alloc_id = (bcmolt_gpon_alloc_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "alloc_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.alloc_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ALLOC, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_ALLOC_KEY_ID_ALLOC_ID, &key.alloc_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, gpon_alloc, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, gpon_alloc, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_parm_by_prefix(session, "sla.");
    if (cli_parm != NULL)
    {
        bcmolt_pon_alloc_sla val = { };
        cli_parm = bcmcli_find_named_parm(session, "sla.cbr_rt_bw");
        if (cli_parm != NULL)
        {
            val.cbr_rt_bw = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "sla.cbr_rt_bw is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "sla.cbr_nrt_bw");
        if (cli_parm != NULL)
        {
            val.cbr_nrt_bw = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "sla.cbr_nrt_bw is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "sla.guaranteed_bw");
        if (cli_parm != NULL)
        {
            val.guaranteed_bw = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "sla.guaranteed_bw is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "sla.maximum_bw");
        if (cli_parm != NULL)
        {
            val.maximum_bw = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "sla.maximum_bw is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "sla.additional_bw_eligibility");
        if (cli_parm != NULL)
        {
            val.additional_bw_eligibility = (bcmolt_additional_bw_eligibility) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "sla.additional_bw_eligibility is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "sla.cbr_rt_compensation");
        if (cli_parm != NULL)
        {
            val.cbr_rt_compensation = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "sla.cbr_rt_compensation is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "sla.cbr_rt_ap_index");
        if (cli_parm != NULL)
        {
            val.cbr_rt_ap_index = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "sla.cbr_rt_ap_index is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "sla.cbr_nrt_ap_index");
        if (cli_parm != NULL)
        {
            val.cbr_nrt_ap_index = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "sla.cbr_nrt_ap_index is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "sla.alloc_type");
        if (cli_parm != NULL)
        {
            val.alloc_type = (bcmolt_alloc_type) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "sla.alloc_type is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "sla.weight");
        if (cli_parm != NULL)
        {
            val.weight = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "sla.weight is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "sla.priority");
        if (cli_parm != NULL)
        {
            val.priority = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "sla.priority is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_alloc, sla, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_pon_alloc_sla val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ALLOC, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_ALLOC_CFG_ID_SLA, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_alloc, sla, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        bcmolt_gpon_onu_id val;
        val = (bcmolt_gpon_onu_id) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_alloc, onu_id, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_alloc, onu_id, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ALLOC, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_ALLOC_CFG_ID_ONU_ID, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "collect_stats");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_alloc, collect_stats, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_alloc, collect_stats, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ALLOC, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_ALLOC_CFG_ID_COLLECT_STATS, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_cfg_set(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_set(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_alloc_cfg_clear(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_alloc_cfg cfg;          /**< declare main API struct */
    bcmolt_gpon_alloc_key key = { };    /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_alloc_cfg cfg;\n");
    bcmcli_log("bcmolt_gpon_alloc_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_clear");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ALLOC, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_ALLOC_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "alloc_id");
    if (cli_parm != NULL)
    {
        key.alloc_id = (bcmolt_gpon_alloc_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "alloc_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.alloc_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ALLOC, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_ALLOC_KEY_ID_ALLOC_ID, &key.alloc_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, gpon_alloc, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, gpon_alloc, key);\n");

    /* call API */
    err = bcmolt_cfg_clear(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_clear(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_alloc_cfg_get_multi(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_alloc_cfg cfg;          /**< declare main API struct */
    bcmolt_gpon_alloc_key key = { };    /**< declare key */
    bcmolt_msg_set *msg_set = NULL;     /**< declare message set */
    uint32_t max_msgs;                  /**< declare max number of msgs to get */
    bcmos_bool invert_filter;           /**< declare filter invert flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_alloc_cfg cfg;\n");
    bcmcli_log("bcmolt_gpon_alloc_key key = {  };\n");
    bcmcli_log("bcmolt_msg_set* msg_set = NULL;\n");
    bcmcli_log("uint32_t max_msgs;\n");
    bcmcli_log("bcmos_bool invert_filter;\n");
    apicli_print_start(session, "bcmolt_cfg_get_multi");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ALLOC, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_ALLOC_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "alloc_id");
    if (cli_parm != NULL)
    {
        key.alloc_id = (bcmolt_gpon_alloc_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "alloc_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.alloc_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ALLOC, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_ALLOC_KEY_ID_ALLOC_ID, &key.alloc_id);
    bcmcli_log(";\n");

    /* set max number of msgs from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "max_msgs");
    if (cli_parm != NULL)
    {
        max_msgs = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "max_msgs is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("max_msgs = %d;\n", max_msgs);

    /* set filter invert flag from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "filter_invert");
    if (cli_parm != NULL)
    {
        invert_filter = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "filter_invert is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("invert_filter = %s;\n", (invert_filter) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* allocate message set */
    err = apicli_msg_set_alloc(byte_pool, BCMOLT_OBJ_ID_GPON_ALLOC, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);
    if (err != BCM_ERR_OK)
    {
        return err;
    }

    bcmcli_log("bcmolt_msg_set_alloc(BCMOLT_OBJ_ID_GPON_ALLOC, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, gpon_alloc, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, gpon_alloc, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "filter.state");
    if (cli_parm != NULL)
    {
        bcmolt_alloc_state val;
        val = (bcmolt_alloc_state) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_alloc, state, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_alloc, state, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ALLOC, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_ALLOC_CFG_ID_STATE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "state");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_alloc, state);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_alloc, state);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.sla.");
    if (cli_parm != NULL)
    {
        bcmolt_pon_alloc_sla val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.sla.cbr_rt_bw");
        if (cli_parm != NULL)
        {
            val.cbr_rt_bw = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.sla.cbr_rt_bw is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.sla.cbr_nrt_bw");
        if (cli_parm != NULL)
        {
            val.cbr_nrt_bw = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.sla.cbr_nrt_bw is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.sla.guaranteed_bw");
        if (cli_parm != NULL)
        {
            val.guaranteed_bw = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.sla.guaranteed_bw is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.sla.maximum_bw");
        if (cli_parm != NULL)
        {
            val.maximum_bw = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.sla.maximum_bw is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.sla.additional_bw_eligibility");
        if (cli_parm != NULL)
        {
            val.additional_bw_eligibility = (bcmolt_additional_bw_eligibility) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.sla.additional_bw_eligibility is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.sla.cbr_rt_compensation");
        if (cli_parm != NULL)
        {
            val.cbr_rt_compensation = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.sla.cbr_rt_compensation is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.sla.cbr_rt_ap_index");
        if (cli_parm != NULL)
        {
            val.cbr_rt_ap_index = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.sla.cbr_rt_ap_index is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.sla.cbr_nrt_ap_index");
        if (cli_parm != NULL)
        {
            val.cbr_nrt_ap_index = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.sla.cbr_nrt_ap_index is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.sla.alloc_type");
        if (cli_parm != NULL)
        {
            val.alloc_type = (bcmolt_alloc_type) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.sla.alloc_type is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.sla.weight");
        if (cli_parm != NULL)
        {
            val.weight = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.sla.weight is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.sla.priority");
        if (cli_parm != NULL)
        {
            val.priority = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.sla.priority is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_alloc, sla, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_pon_alloc_sla val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ALLOC, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_ALLOC_CFG_ID_SLA, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_alloc, sla, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "sla");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_alloc, sla);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_alloc, sla);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.onu_id");
    if (cli_parm != NULL)
    {
        bcmolt_gpon_onu_id val;
        val = (bcmolt_gpon_onu_id) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_alloc, onu_id, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_alloc, onu_id, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ALLOC, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_ALLOC_CFG_ID_ONU_ID, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_alloc, onu_id);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_alloc, onu_id);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.collect_stats");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_alloc, collect_stats, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_alloc, collect_stats, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ALLOC, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_ALLOC_CFG_ID_COLLECT_STATS, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "collect_stats");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_alloc, collect_stats);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_alloc, collect_stats);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_alloc, state) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_alloc, sla) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_alloc, onu_id) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_alloc, collect_stats))
    {
        BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_alloc, all_properties);
        bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_alloc, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);
    bcmcli_log("bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_alloc_stat_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_alloc_stat stat;        /**< declare main API struct */
    bcmolt_gpon_alloc_key key = { };    /**< declare key */
    bcmos_bool clear_on_read;           /**< declare 'clear on read' flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_alloc_stat stat;\n");
    bcmcli_log("bcmolt_gpon_alloc_key key = {  };\n");
    bcmcli_log("bcmos_bool clear_on_read;\n");
    apicli_print_start(session, "bcmolt_stat_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ALLOC, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_ALLOC_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "alloc_id");
    if (cli_parm != NULL)
    {
        key.alloc_id = (bcmolt_gpon_alloc_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "alloc_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.alloc_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ALLOC, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_ALLOC_KEY_ID_ALLOC_ID, &key.alloc_id);
    bcmcli_log(";\n");

    /* set stat flags from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "clear");
    if (cli_parm != NULL)
    {
        clear_on_read = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "clear is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("clear_on_read = %s;\n", (clear_on_read) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* init the API struct */
    BCMOLT_STAT_INIT(&stat, gpon_alloc, key);
    bcmcli_log("BCMOLT_STAT_INIT(&stat, gpon_alloc, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "rx_bytes");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_alloc, rx_bytes);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_alloc, rx_bytes);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_STAT_PROP_IS_SET(&stat, gpon_alloc, rx_bytes))
    {
        BCMOLT_STAT_PROP_GET(&stat, gpon_alloc, all_properties);
        bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_alloc, all_properties);\n");
    }

    /* call API */
    err = bcmolt_stat_get(device_id, &stat.hdr, clear_on_read);
    bcmcli_log("bcmolt_stat_get(device_id, &stat.hdr, clear_on_read);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &stat.hdr.hdr);
    }

    apicli_print_complete(session, err, stat.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_alloc_oper_set_state_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_alloc_set_state oper;   /**< declare main API struct */
    bcmolt_gpon_alloc_key key = { };    /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_alloc_set_state oper;\n");
    bcmcli_log("bcmolt_gpon_alloc_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ALLOC, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_ALLOC_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "alloc_id");
    if (cli_parm != NULL)
    {
        key.alloc_id = (bcmolt_gpon_alloc_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "alloc_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.alloc_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ALLOC, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_ALLOC_KEY_ID_ALLOC_ID, &key.alloc_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, gpon_alloc, set_state, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, gpon_alloc, set_state, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "state");
    if (cli_parm != NULL)
    {
        bcmolt_alloc_operation val;
        val = (bcmolt_alloc_operation) cli_parm->value.enum_val;
        BCMOLT_OPER_PROP_SET(&oper, gpon_alloc, set_state, state, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, gpon_alloc, set_state, state, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ALLOC, BCMOLT_MGT_GROUP_OPER, BCMOLT_GPON_ALLOC_OPER_ID_SET_STATE, BCMOLT_GPON_ALLOC_SET_STATE_ID_STATE, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_alloc_oper_get_stats_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_alloc_get_stats oper;   /**< declare main API struct */
    bcmolt_gpon_alloc_key key = { };    /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_alloc_get_stats oper;\n");
    bcmcli_log("bcmolt_gpon_alloc_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ALLOC, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_ALLOC_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "alloc_id");
    if (cli_parm != NULL)
    {
        key.alloc_id = (bcmolt_gpon_alloc_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "alloc_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.alloc_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ALLOC, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_ALLOC_KEY_ID_ALLOC_ID, &key.alloc_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, gpon_alloc, get_stats, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, gpon_alloc, get_stats, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "num_of_cycles");
    if (cli_parm != NULL)
    {
        uint32_t val;
        val = cli_parm->value.unumber;
        BCMOLT_OPER_PROP_SET(&oper, gpon_alloc, get_stats, num_of_cycles, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, gpon_alloc, get_stats, num_of_cycles, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ALLOC, BCMOLT_MGT_GROUP_OPER, BCMOLT_GPON_ALLOC_OPER_ID_GET_STATS, BCMOLT_GPON_ALLOC_GET_STATS_ID_NUM_OF_CYCLES, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_alloc_stat_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_alloc_stat_cfg stat_cfg;    /**< declare main API struct */
    bcmolt_gpon_alloc_key key = { };        /**< declare key */
    bcmolt_gpon_alloc_stat_id stat_id;      /**< declare stat ID */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_alloc_stat_cfg stat_cfg;\n");
    bcmcli_log("bcmolt_gpon_alloc_key key = {  };\n");
    apicli_print_start(session, "bcmolt_stat_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ALLOC, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_ALLOC_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "alloc_id");
    if (cli_parm != NULL)
    {
        key.alloc_id = (bcmolt_gpon_alloc_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "alloc_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.alloc_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ALLOC, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_ALLOC_KEY_ID_ALLOC_ID, &key.alloc_id);
    bcmcli_log(";\n");

    /* set stat ID from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "sub");
    if (cli_parm != NULL)
    {
        stat_id = (bcmolt_gpon_alloc_stat_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
        return BCM_ERR_PARM;
    }

    /* init the API struct */
    switch (stat_id)
    {
        case BCMOLT_GPON_ALLOC_STAT_ID_RX_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_alloc, rx_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_alloc, rx_bytes, key);\n");
            break;
        default:
            apicli_print_complete(session, BCM_ERR_RANGE, "\n");
            return BCM_ERR_RANGE;
    }

    /* call API */
    err = bcmolt_stat_cfg_get(device_id, &stat_cfg.hdr);
    bcmcli_log("bcmolt_stat_cfg_get(device_id, &stat_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &stat_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, stat_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_alloc_stat_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_alloc_stat_cfg stat_cfg;    /**< declare main API struct */
    bcmolt_gpon_alloc_key key = { };        /**< declare key */
    bcmolt_gpon_alloc_stat_id stat_id;      /**< declare stat ID */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_alloc_stat_cfg stat_cfg;\n");
    bcmcli_log("bcmolt_gpon_alloc_key key = {  };\n");
    apicli_print_start(session, "bcmolt_stat_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ALLOC, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_ALLOC_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "alloc_id");
    if (cli_parm != NULL)
    {
        key.alloc_id = (bcmolt_gpon_alloc_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "alloc_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.alloc_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ALLOC, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_ALLOC_KEY_ID_ALLOC_ID, &key.alloc_id);
    bcmcli_log(";\n");

    /* set stat ID from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "sub");
    if (cli_parm != NULL)
    {
        stat_id = (bcmolt_gpon_alloc_stat_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
        return BCM_ERR_PARM;
    }

    /* init the API struct */
    switch (stat_id)
    {
        case BCMOLT_GPON_ALLOC_STAT_ID_RX_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_alloc, rx_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_alloc, rx_bytes, key);\n");
            break;
        default:
            apicli_print_complete(session, BCM_ERR_RANGE, "\n");
            return BCM_ERR_RANGE;
    }

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.");
    if (cli_parm != NULL)
    {
        bcmolt_stat_alarm_config val = { };
        cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.trigger.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.type");
            if (cli_parm != NULL)
            {
                val.trigger.type = (bcmolt_stat_condition_type) cli_parm->value.enum_val;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.type is not set\n");
                return BCM_ERR_PARM;
            }

            switch (val.trigger.type)
            {
                case BCMOLT_STAT_CONDITION_TYPE_RATE_THRESHOLD:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.rising");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_threshold.rising = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.rising is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.falling");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_threshold.falling = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.falling is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_RATE_RANGE:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.upper");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_range.upper = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.upper is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.lower");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_range.lower = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.lower is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_VALUE_THRESHOLD:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.limit");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.value_threshold.limit = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.limit is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_NONE:
                    break;
                default:
                    apicli_print_complete(session, BCM_ERR_RANGE, "\n");
                    return BCM_ERR_RANGE;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.soak.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "cfg.soak.active_soak_time");
            if (cli_parm != NULL)
            {
                val.soak.active_soak_time = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak.active_soak_time is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "cfg.soak.clear_soak_time");
            if (cli_parm != NULL)
            {
                val.soak.clear_soak_time = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak.clear_soak_time is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_STAT_CFG_PROP_SET(&stat_cfg, gpon_alloc, cfg, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_stat_alarm_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ALLOC, BCMOLT_MGT_GROUP_STAT_CFG, 0, BCMOLT_GPON_ALLOC_STAT_CFG_ID_CFG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_STAT_CFG_PROP_SET(&stat_cfg, gpon_alloc, cfg, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_stat_cfg_set(device_id, &stat_cfg.hdr);
    bcmcli_log("bcmolt_stat_cfg_set(device_id, &stat_cfg.hdr);\n");
    apicli_print_complete(session, err, stat_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_alloc_auto_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_alloc_auto_cfg auto_cfg;    /**< declare main API struct */
    bcmolt_gpon_alloc_key key = { };        /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_alloc_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_gpon_alloc_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_get");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, gpon_alloc, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, gpon_alloc, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "configuration_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_alloc, configuration_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_alloc, configuration_completed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "get_alloc_stats_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_alloc, get_alloc_stats_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_alloc, get_alloc_stats_completed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_cleared");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_alloc, stat_alarm_cleared);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_alloc, stat_alarm_cleared);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_raised");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_alloc, stat_alarm_raised);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_alloc, stat_alarm_raised);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_alloc, configuration_completed) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_alloc, get_alloc_stats_completed) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_alloc, stat_alarm_cleared) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_alloc, stat_alarm_raised))
    {
        BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_alloc, all_properties);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_alloc, all_properties);\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &auto_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_alloc_auto_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_alloc_auto_cfg auto_cfg;    /**< declare main API struct */
    bcmolt_gpon_alloc_key key = { };        /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_alloc_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_gpon_alloc_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_set");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, gpon_alloc, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, gpon_alloc, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "configuration_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_alloc, configuration_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_alloc, configuration_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ALLOC, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_ALLOC_AUTO_CFG_ID_CONFIGURATION_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "get_alloc_stats_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_alloc, get_alloc_stats_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_alloc, get_alloc_stats_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ALLOC, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_ALLOC_AUTO_CFG_ID_GET_ALLOC_STATS_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_cleared");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_alloc, stat_alarm_cleared, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_alloc, stat_alarm_cleared, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ALLOC, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_ALLOC_AUTO_CFG_ID_STAT_ALARM_CLEARED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_raised");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_alloc, stat_alarm_raised, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_alloc, stat_alarm_raised, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ALLOC, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_ALLOC_AUTO_CFG_ID_STAT_ALARM_RAISED, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);\n");
    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_gem_port_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_gem_port_cfg cfg;       /**< declare main API struct */
    bcmolt_gpon_gem_port_key key = { }; /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_gem_port_cfg cfg;\n");
    bcmcli_log("bcmolt_gpon_gem_port_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_GEM_PORT_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "gem_port_id");
    if (cli_parm != NULL)
    {
        key.gem_port_id = (bcmolt_gpon_gem_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "gem_port_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.gem_port_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_GEM_PORT_KEY_ID_GEM_PORT_ID, &key.gem_port_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, gpon_gem_port, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, gpon_gem_port, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "configuration");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_gem_port, configuration);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_gem_port, configuration);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_gem_port, onu_id);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_gem_port, onu_id);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "gem_port_state");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_gem_port, gem_port_state);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_gem_port, gem_port_state);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "downstream_encryption_mode");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_gem_port, downstream_encryption_mode);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_gem_port, downstream_encryption_mode);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "upstream_destination_queue");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_gem_port, upstream_destination_queue);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_gem_port, upstream_destination_queue);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "control");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_gem_port, control);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_gem_port, control);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "debug_flow_config");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_gem_port, debug_flow_config);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_gem_port, debug_flow_config);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "mac_table_entry_limit");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_gem_port, mac_table_entry_limit);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_gem_port, mac_table_entry_limit);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_gem_port, configuration) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_gem_port, onu_id) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_gem_port, gem_port_state) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_gem_port, downstream_encryption_mode) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_gem_port, upstream_destination_queue) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_gem_port, control) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_gem_port, debug_flow_config) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_gem_port, mac_table_entry_limit))
    {
        BCMOLT_CFG_PROP_GET(&cfg, gpon_gem_port, all_properties);
        bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_gem_port, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_get(device_id, &cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_gem_port_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_gem_port_cfg cfg;       /**< declare main API struct */
    bcmolt_gpon_gem_port_key key = { }; /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_gem_port_cfg cfg;\n");
    bcmcli_log("bcmolt_gpon_gem_port_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_GEM_PORT_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "gem_port_id");
    if (cli_parm != NULL)
    {
        key.gem_port_id = (bcmolt_gpon_gem_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "gem_port_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.gem_port_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_GEM_PORT_KEY_ID_GEM_PORT_ID, &key.gem_port_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, gpon_gem_port, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, gpon_gem_port, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_parm_by_prefix(session, "configuration.");
    if (cli_parm != NULL)
    {
        bcmolt_gem_port_configuration val = { };
        cli_parm = bcmcli_find_named_parm(session, "configuration.direction");
        if (cli_parm != NULL)
        {
            val.direction = (bcmolt_gem_port_direction) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "configuration.direction is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "configuration.type");
        if (cli_parm != NULL)
        {
            val.type = (bcmolt_gem_port_type) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "configuration.type is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_gem_port, configuration, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_gem_port_configuration val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_GEM_PORT_CFG_ID_CONFIGURATION, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_gem_port, configuration, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        bcmolt_gpon_onu_id val;
        val = (bcmolt_gpon_onu_id) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_gem_port, onu_id, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_gem_port, onu_id, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_GEM_PORT_CFG_ID_ONU_ID, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "downstream_encryption_mode");
    if (cli_parm != NULL)
    {
        bcmolt_control_state val;
        val = (bcmolt_control_state) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_gem_port, downstream_encryption_mode, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_gem_port, downstream_encryption_mode, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_GEM_PORT_CFG_ID_DOWNSTREAM_ENCRYPTION_MODE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "upstream_destination_queue");
    if (cli_parm != NULL)
    {
        bcmolt_us_gem_port_destination val;
        val = (bcmolt_us_gem_port_destination) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_gem_port, upstream_destination_queue, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_gem_port, upstream_destination_queue, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_GEM_PORT_CFG_ID_UPSTREAM_DESTINATION_QUEUE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "control");
    if (cli_parm != NULL)
    {
        bcmolt_control_state val;
        val = (bcmolt_control_state) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_gem_port, control, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_gem_port, control, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_GEM_PORT_CFG_ID_CONTROL, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "debug_flow_config.");
    if (cli_parm != NULL)
    {
        bcmolt_gpon_debug_flow_config val = { };
        cli_parm = bcmcli_find_named_parm(session, "debug_flow_config.untagged_flow");
        if (cli_parm != NULL)
        {
            val.untagged_flow = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "debug_flow_config.untagged_flow is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "debug_flow_config.untagged_vid");
        if (cli_parm != NULL)
        {
            val.untagged_vid = (bcmolt_vlan_id) cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "debug_flow_config.untagged_vid is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_gem_port, debug_flow_config, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_gpon_debug_flow_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_GEM_PORT_CFG_ID_DEBUG_FLOW_CONFIG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_gem_port, debug_flow_config, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "mac_table_entry_limit");
    if (cli_parm != NULL)
    {
        uint16_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_gem_port, mac_table_entry_limit, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_gem_port, mac_table_entry_limit, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_GEM_PORT_CFG_ID_MAC_TABLE_ENTRY_LIMIT, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_cfg_set(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_set(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_gem_port_cfg_clear(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_gem_port_cfg cfg;       /**< declare main API struct */
    bcmolt_gpon_gem_port_key key = { }; /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_gem_port_cfg cfg;\n");
    bcmcli_log("bcmolt_gpon_gem_port_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_clear");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_GEM_PORT_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "gem_port_id");
    if (cli_parm != NULL)
    {
        key.gem_port_id = (bcmolt_gpon_gem_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "gem_port_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.gem_port_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_GEM_PORT_KEY_ID_GEM_PORT_ID, &key.gem_port_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, gpon_gem_port, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, gpon_gem_port, key);\n");

    /* call API */
    err = bcmolt_cfg_clear(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_clear(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_gem_port_cfg_get_multi(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_gem_port_cfg cfg;       /**< declare main API struct */
    bcmolt_gpon_gem_port_key key = { }; /**< declare key */
    bcmolt_msg_set *msg_set = NULL;     /**< declare message set */
    uint32_t max_msgs;                  /**< declare max number of msgs to get */
    bcmos_bool invert_filter;           /**< declare filter invert flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_gem_port_cfg cfg;\n");
    bcmcli_log("bcmolt_gpon_gem_port_key key = {  };\n");
    bcmcli_log("bcmolt_msg_set* msg_set = NULL;\n");
    bcmcli_log("uint32_t max_msgs;\n");
    bcmcli_log("bcmos_bool invert_filter;\n");
    apicli_print_start(session, "bcmolt_cfg_get_multi");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_GEM_PORT_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "gem_port_id");
    if (cli_parm != NULL)
    {
        key.gem_port_id = (bcmolt_gpon_gem_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "gem_port_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.gem_port_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_GEM_PORT_KEY_ID_GEM_PORT_ID, &key.gem_port_id);
    bcmcli_log(";\n");

    /* set max number of msgs from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "max_msgs");
    if (cli_parm != NULL)
    {
        max_msgs = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "max_msgs is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("max_msgs = %d;\n", max_msgs);

    /* set filter invert flag from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "filter_invert");
    if (cli_parm != NULL)
    {
        invert_filter = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "filter_invert is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("invert_filter = %s;\n", (invert_filter) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* allocate message set */
    err = apicli_msg_set_alloc(byte_pool, BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);
    if (err != BCM_ERR_OK)
    {
        return err;
    }

    bcmcli_log("bcmolt_msg_set_alloc(BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, gpon_gem_port, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, gpon_gem_port, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.configuration.");
    if (cli_parm != NULL)
    {
        bcmolt_gem_port_configuration val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.configuration.direction");
        if (cli_parm != NULL)
        {
            val.direction = (bcmolt_gem_port_direction) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.configuration.direction is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.configuration.type");
        if (cli_parm != NULL)
        {
            val.type = (bcmolt_gem_port_type) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.configuration.type is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_gem_port, configuration, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_gem_port_configuration val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_GEM_PORT_CFG_ID_CONFIGURATION, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_gem_port, configuration, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "configuration");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_gem_port, configuration);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_gem_port, configuration);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.onu_id");
    if (cli_parm != NULL)
    {
        bcmolt_gpon_onu_id val;
        val = (bcmolt_gpon_onu_id) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_gem_port, onu_id, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_gem_port, onu_id, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_GEM_PORT_CFG_ID_ONU_ID, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_gem_port, onu_id);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_gem_port, onu_id);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.gem_port_state");
    if (cli_parm != NULL)
    {
        bcmolt_gpon_gem_port_state val;
        val = (bcmolt_gpon_gem_port_state) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_gem_port, gem_port_state, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_gem_port, gem_port_state, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_GEM_PORT_CFG_ID_GEM_PORT_STATE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "gem_port_state");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_gem_port, gem_port_state);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_gem_port, gem_port_state);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.downstream_encryption_mode");
    if (cli_parm != NULL)
    {
        bcmolt_control_state val;
        val = (bcmolt_control_state) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_gem_port, downstream_encryption_mode, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_gem_port, downstream_encryption_mode, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_GEM_PORT_CFG_ID_DOWNSTREAM_ENCRYPTION_MODE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "downstream_encryption_mode");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_gem_port, downstream_encryption_mode);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_gem_port, downstream_encryption_mode);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.upstream_destination_queue");
    if (cli_parm != NULL)
    {
        bcmolt_us_gem_port_destination val;
        val = (bcmolt_us_gem_port_destination) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_gem_port, upstream_destination_queue, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_gem_port, upstream_destination_queue, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_GEM_PORT_CFG_ID_UPSTREAM_DESTINATION_QUEUE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "upstream_destination_queue");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_gem_port, upstream_destination_queue);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_gem_port, upstream_destination_queue);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.control");
    if (cli_parm != NULL)
    {
        bcmolt_control_state val;
        val = (bcmolt_control_state) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_gem_port, control, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_gem_port, control, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_GEM_PORT_CFG_ID_CONTROL, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "control");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_gem_port, control);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_gem_port, control);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.debug_flow_config.");
    if (cli_parm != NULL)
    {
        bcmolt_gpon_debug_flow_config val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.debug_flow_config.untagged_flow");
        if (cli_parm != NULL)
        {
            val.untagged_flow = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.debug_flow_config.untagged_flow is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.debug_flow_config.untagged_vid");
        if (cli_parm != NULL)
        {
            val.untagged_vid = (bcmolt_vlan_id) cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.debug_flow_config.untagged_vid is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_gem_port, debug_flow_config, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_gpon_debug_flow_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_GEM_PORT_CFG_ID_DEBUG_FLOW_CONFIG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_gem_port, debug_flow_config, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "debug_flow_config");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_gem_port, debug_flow_config);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_gem_port, debug_flow_config);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.mac_table_entry_limit");
    if (cli_parm != NULL)
    {
        uint16_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_gem_port, mac_table_entry_limit, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_gem_port, mac_table_entry_limit, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_GEM_PORT_CFG_ID_MAC_TABLE_ENTRY_LIMIT, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "mac_table_entry_limit");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_gem_port, mac_table_entry_limit);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_gem_port, mac_table_entry_limit);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_gem_port, configuration) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_gem_port, onu_id) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_gem_port, gem_port_state) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_gem_port, downstream_encryption_mode) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_gem_port, upstream_destination_queue) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_gem_port, control) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_gem_port, debug_flow_config) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_gem_port, mac_table_entry_limit))
    {
        BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_gem_port, all_properties);
        bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_gem_port, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);
    bcmcli_log("bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_gem_port_stat_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_gem_port_stat stat;     /**< declare main API struct */
    bcmolt_gpon_gem_port_key key = { }; /**< declare key */
    bcmos_bool clear_on_read;           /**< declare 'clear on read' flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_gem_port_stat stat;\n");
    bcmcli_log("bcmolt_gpon_gem_port_key key = {  };\n");
    bcmcli_log("bcmos_bool clear_on_read;\n");
    apicli_print_start(session, "bcmolt_stat_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_GEM_PORT_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "gem_port_id");
    if (cli_parm != NULL)
    {
        key.gem_port_id = (bcmolt_gpon_gem_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "gem_port_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.gem_port_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_GEM_PORT_KEY_ID_GEM_PORT_ID, &key.gem_port_id);
    bcmcli_log(";\n");

    /* set stat flags from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "clear");
    if (cli_parm != NULL)
    {
        clear_on_read = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "clear is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("clear_on_read = %s;\n", (clear_on_read) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* init the API struct */
    BCMOLT_STAT_INIT(&stat, gpon_gem_port, key);
    bcmcli_log("BCMOLT_STAT_INIT(&stat, gpon_gem_port, 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)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_gem_port, rx_packets);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_gem_port, rx_packets);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_bytes");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_gem_port, rx_bytes);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_gem_port, rx_bytes);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_packets");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_gem_port, tx_packets);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_gem_port, tx_packets);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_bytes");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_gem_port, tx_bytes);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_gem_port, tx_bytes);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_STAT_PROP_IS_SET(&stat, gpon_gem_port, rx_packets) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_gem_port, rx_bytes) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_gem_port, tx_packets) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_gem_port, tx_bytes))
    {
        BCMOLT_STAT_PROP_GET(&stat, gpon_gem_port, all_properties);
        bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_gem_port, all_properties);\n");
    }

    /* call API */
    err = bcmolt_stat_get(device_id, &stat.hdr, clear_on_read);
    bcmcli_log("bcmolt_stat_get(device_id, &stat.hdr, clear_on_read);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &stat.hdr.hdr);
    }

    apicli_print_complete(session, err, stat.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_gem_port_oper_set_state_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_gem_port_set_state oper;    /**< declare main API struct */
    bcmolt_gpon_gem_port_key key = { };     /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_gem_port_set_state oper;\n");
    bcmcli_log("bcmolt_gpon_gem_port_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_GEM_PORT_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "gem_port_id");
    if (cli_parm != NULL)
    {
        key.gem_port_id = (bcmolt_gpon_gem_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "gem_port_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.gem_port_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_GEM_PORT_KEY_ID_GEM_PORT_ID, &key.gem_port_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, gpon_gem_port, set_state, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, gpon_gem_port, set_state, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "state");
    if (cli_parm != NULL)
    {
        bcmolt_gem_port_operation val;
        val = (bcmolt_gem_port_operation) cli_parm->value.enum_val;
        BCMOLT_OPER_PROP_SET(&oper, gpon_gem_port, set_state, state, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, gpon_gem_port, set_state, state, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_OPER, BCMOLT_GPON_GEM_PORT_OPER_ID_SET_STATE, BCMOLT_GPON_GEM_PORT_SET_STATE_ID_STATE, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_gem_port_stat_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_gem_port_stat_cfg stat_cfg; /**< declare main API struct */
    bcmolt_gpon_gem_port_key key = { };     /**< declare key */
    bcmolt_gpon_gem_port_stat_id stat_id;   /**< declare stat ID */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_gem_port_stat_cfg stat_cfg;\n");
    bcmcli_log("bcmolt_gpon_gem_port_key key = {  };\n");
    apicli_print_start(session, "bcmolt_stat_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_GEM_PORT_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "gem_port_id");
    if (cli_parm != NULL)
    {
        key.gem_port_id = (bcmolt_gpon_gem_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "gem_port_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.gem_port_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_GEM_PORT_KEY_ID_GEM_PORT_ID, &key.gem_port_id);
    bcmcli_log(";\n");

    /* set stat ID from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "sub");
    if (cli_parm != NULL)
    {
        stat_id = (bcmolt_gpon_gem_port_stat_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
        return BCM_ERR_PARM;
    }

    /* init the API struct */
    switch (stat_id)
    {
        case BCMOLT_GPON_GEM_PORT_STAT_ID_RX_PACKETS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_gem_port, rx_packets, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_gem_port, rx_packets, key);\n");
            break;
        case BCMOLT_GPON_GEM_PORT_STAT_ID_RX_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_gem_port, rx_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_gem_port, rx_bytes, key);\n");
            break;
        case BCMOLT_GPON_GEM_PORT_STAT_ID_TX_PACKETS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_gem_port, tx_packets, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_gem_port, tx_packets, key);\n");
            break;
        case BCMOLT_GPON_GEM_PORT_STAT_ID_TX_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_gem_port, tx_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_gem_port, tx_bytes, key);\n");
            break;
        default:
            apicli_print_complete(session, BCM_ERR_RANGE, "\n");
            return BCM_ERR_RANGE;
    }

    /* call API */
    err = bcmolt_stat_cfg_get(device_id, &stat_cfg.hdr);
    bcmcli_log("bcmolt_stat_cfg_get(device_id, &stat_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &stat_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, stat_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_gem_port_stat_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_gem_port_stat_cfg stat_cfg; /**< declare main API struct */
    bcmolt_gpon_gem_port_key key = { };     /**< declare key */
    bcmolt_gpon_gem_port_stat_id stat_id;   /**< declare stat ID */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_gem_port_stat_cfg stat_cfg;\n");
    bcmcli_log("bcmolt_gpon_gem_port_key key = {  };\n");
    apicli_print_start(session, "bcmolt_stat_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_GEM_PORT_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "gem_port_id");
    if (cli_parm != NULL)
    {
        key.gem_port_id = (bcmolt_gpon_gem_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "gem_port_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.gem_port_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_GEM_PORT_KEY_ID_GEM_PORT_ID, &key.gem_port_id);
    bcmcli_log(";\n");

    /* set stat ID from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "sub");
    if (cli_parm != NULL)
    {
        stat_id = (bcmolt_gpon_gem_port_stat_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
        return BCM_ERR_PARM;
    }

    /* init the API struct */
    switch (stat_id)
    {
        case BCMOLT_GPON_GEM_PORT_STAT_ID_RX_PACKETS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_gem_port, rx_packets, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_gem_port, rx_packets, key);\n");
            break;
        case BCMOLT_GPON_GEM_PORT_STAT_ID_RX_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_gem_port, rx_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_gem_port, rx_bytes, key);\n");
            break;
        case BCMOLT_GPON_GEM_PORT_STAT_ID_TX_PACKETS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_gem_port, tx_packets, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_gem_port, tx_packets, key);\n");
            break;
        case BCMOLT_GPON_GEM_PORT_STAT_ID_TX_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_gem_port, tx_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_gem_port, tx_bytes, key);\n");
            break;
        default:
            apicli_print_complete(session, BCM_ERR_RANGE, "\n");
            return BCM_ERR_RANGE;
    }

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.");
    if (cli_parm != NULL)
    {
        bcmolt_stat_alarm_config val = { };
        cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.trigger.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.type");
            if (cli_parm != NULL)
            {
                val.trigger.type = (bcmolt_stat_condition_type) cli_parm->value.enum_val;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.type is not set\n");
                return BCM_ERR_PARM;
            }

            switch (val.trigger.type)
            {
                case BCMOLT_STAT_CONDITION_TYPE_RATE_THRESHOLD:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.rising");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_threshold.rising = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.rising is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.falling");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_threshold.falling = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.falling is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_RATE_RANGE:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.upper");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_range.upper = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.upper is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.lower");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_range.lower = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.lower is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_VALUE_THRESHOLD:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.limit");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.value_threshold.limit = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.limit is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_NONE:
                    break;
                default:
                    apicli_print_complete(session, BCM_ERR_RANGE, "\n");
                    return BCM_ERR_RANGE;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.soak.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "cfg.soak.active_soak_time");
            if (cli_parm != NULL)
            {
                val.soak.active_soak_time = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak.active_soak_time is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "cfg.soak.clear_soak_time");
            if (cli_parm != NULL)
            {
                val.soak.clear_soak_time = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak.clear_soak_time is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_STAT_CFG_PROP_SET(&stat_cfg, gpon_gem_port, cfg, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_stat_alarm_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_STAT_CFG, 0, BCMOLT_GPON_GEM_PORT_STAT_CFG_ID_CFG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_STAT_CFG_PROP_SET(&stat_cfg, gpon_gem_port, cfg, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_stat_cfg_set(device_id, &stat_cfg.hdr);
    bcmcli_log("bcmolt_stat_cfg_set(device_id, &stat_cfg.hdr);\n");
    apicli_print_complete(session, err, stat_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_gem_port_auto_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_gem_port_auto_cfg auto_cfg; /**< declare main API struct */
    bcmolt_gpon_gem_port_key key = { };     /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_gem_port_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_gpon_gem_port_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_get");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, gpon_gem_port, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, gpon_gem_port, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "configuration_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_gem_port, configuration_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_gem_port, configuration_completed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_cleared");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_gem_port, stat_alarm_cleared);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_gem_port, stat_alarm_cleared);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_raised");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_gem_port, stat_alarm_raised);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_gem_port, stat_alarm_raised);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_gem_port, configuration_completed) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_gem_port, stat_alarm_cleared) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_gem_port, stat_alarm_raised))
    {
        BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_gem_port, all_properties);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_gem_port, all_properties);\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &auto_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_gem_port_auto_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_gem_port_auto_cfg auto_cfg; /**< declare main API struct */
    bcmolt_gpon_gem_port_key key = { };     /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_gem_port_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_gpon_gem_port_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_set");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, gpon_gem_port, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, gpon_gem_port, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "configuration_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_gem_port, configuration_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_gem_port, configuration_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_GEM_PORT_AUTO_CFG_ID_CONFIGURATION_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_cleared");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_gem_port, stat_alarm_cleared, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_gem_port, stat_alarm_cleared, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_GEM_PORT_AUTO_CFG_ID_STAT_ALARM_CLEARED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_raised");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_gem_port, stat_alarm_raised, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_gem_port, stat_alarm_raised, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_GEM_PORT_AUTO_CFG_ID_STAT_ALARM_RAISED, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);\n");
    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_iwf_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_iwf_cfg cfg;        /**< declare main API struct */
    bcmolt_gpon_iwf_key key = { };  /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_iwf_cfg cfg;\n");
    bcmcli_log("bcmolt_gpon_iwf_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_IWF_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, gpon_iwf, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, gpon_iwf, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "iwf_mode");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf, iwf_mode);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf, iwf_mode);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "us_tpid_per_flow");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf, us_tpid_per_flow);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf, us_tpid_per_flow);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "us_otag_direct_tpid");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf, us_otag_direct_tpid);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf, us_otag_direct_tpid);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "us_otag_direct_pbit");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf, us_otag_direct_pbit);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf, us_otag_direct_pbit);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "ds_tpid");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf, ds_tpid);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf, ds_tpid);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "mac_table_configuration");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf, mac_table_configuration);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf, mac_table_configuration);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "debug_flow_configuration");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf, debug_flow_configuration);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf, debug_flow_configuration);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "mac_table_count");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf, mac_table_count);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf, mac_table_count);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "forbidden_vlan_flow_gem_range_start");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf, forbidden_vlan_flow_gem_range_start);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf, forbidden_vlan_flow_gem_range_start);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_iwf, iwf_mode) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_iwf, us_tpid_per_flow) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_iwf, us_otag_direct_tpid) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_iwf, us_otag_direct_pbit) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_iwf, ds_tpid) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_iwf, mac_table_configuration) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_iwf, debug_flow_configuration) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_iwf, mac_table_count) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_iwf, forbidden_vlan_flow_gem_range_start))
    {
        BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf, all_properties);
        bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_get(device_id, &cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_iwf_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_iwf_cfg cfg;        /**< declare main API struct */
    bcmolt_gpon_iwf_key key = { };  /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_iwf_cfg cfg;\n");
    bcmcli_log("bcmolt_gpon_iwf_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_IWF_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, gpon_iwf, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, gpon_iwf, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "iwf_mode");
    if (cli_parm != NULL)
    {
        bcmolt_iwf_mode val;
        val = (bcmolt_iwf_mode) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf, iwf_mode, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf, iwf_mode, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_IWF_CFG_ID_IWF_MODE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "us_tpid_per_flow.");
    if (cli_parm != NULL)
    {
        bcmolt_arr_u16_2_hex val = { };
        cli_parm = bcmcli_find_named_parm(session, "us_tpid_per_flow.arr");
        if (cli_parm != NULL)
        {
            int32_t i0;
            if (cli_parm->array_size != 2)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "array us_tpid_per_flow.arr must have 2 elements\n");
                return BCM_ERR_PARM;
            }

            for (i0 = 0; i0 < 2; i0++)
            {
                val.arr[i0] = cli_parm->values[i0].unumber;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "us_tpid_per_flow.arr is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf, us_tpid_per_flow, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_arr_u16_2_hex val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_IWF_CFG_ID_US_TPID_PER_FLOW, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf, us_tpid_per_flow, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "us_otag_direct_tpid");
    if (cli_parm != NULL)
    {
        uint16_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf, us_otag_direct_tpid, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf, us_otag_direct_tpid, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_IWF_CFG_ID_US_OTAG_DIRECT_TPID, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "us_otag_direct_pbit");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf, us_otag_direct_pbit, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf, us_otag_direct_pbit, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_IWF_CFG_ID_US_OTAG_DIRECT_PBIT, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "ds_tpid.");
    if (cli_parm != NULL)
    {
        bcmolt_arr_u16_5_hex val = { };
        cli_parm = bcmcli_find_named_parm(session, "ds_tpid.arr");
        if (cli_parm != NULL)
        {
            int32_t i1;
            if (cli_parm->array_size != 5)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "array ds_tpid.arr must have 5 elements\n");
                return BCM_ERR_PARM;
            }

            for (i1 = 0; i1 < 5; i1++)
            {
                val.arr[i1] = cli_parm->values[i1].unumber;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ds_tpid.arr is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf, ds_tpid, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_arr_u16_5_hex val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_IWF_CFG_ID_DS_TPID, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf, ds_tpid, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "mac_table_configuration.");
    if (cli_parm != NULL)
    {
        bcmolt_mac_table_configuration val = { };
        cli_parm = bcmcli_find_named_parm(session, "mac_table_configuration.miss_fallback");
        if (cli_parm != NULL)
        {
            val.miss_fallback = (bcmolt_mac_table_miss_fallback) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "mac_table_configuration.miss_fallback is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "mac_table_configuration.default_flow_id");
        if (cli_parm != NULL)
        {
            val.default_flow_id = (bcmolt_flow_id) cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "mac_table_configuration.default_flow_id is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "mac_table_configuration.aging_time");
        if (cli_parm != NULL)
        {
            val.aging_time = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "mac_table_configuration.aging_time is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "mac_table_configuration.learning_mode");
        if (cli_parm != NULL)
        {
            val.learning_mode = (bcmolt_mac_table_learning_mode) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "mac_table_configuration.learning_mode is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "mac_table_configuration.automatic_mac_learning");
        if (cli_parm != NULL)
        {
            val.automatic_mac_learning = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "mac_table_configuration.automatic_mac_learning is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "mac_table_configuration.automatic_mac_aging");
        if (cli_parm != NULL)
        {
            val.automatic_mac_aging = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "mac_table_configuration.automatic_mac_aging is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "mac_table_configuration.automatic_mac_move");
        if (cli_parm != NULL)
        {
            val.automatic_mac_move = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "mac_table_configuration.automatic_mac_move is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "mac_table_configuration.automatic_static_mode");
        if (cli_parm != NULL)
        {
            val.automatic_static_mode = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "mac_table_configuration.automatic_static_mode is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf, mac_table_configuration, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_mac_table_configuration val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_IWF_CFG_ID_MAC_TABLE_CONFIGURATION, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf, mac_table_configuration, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "debug_flow_configuration.");
    if (cli_parm != NULL)
    {
        bcmolt_gpon_iwf_debug_flow_config val = { };
        cli_parm = bcmcli_find_named_parm(session, "debug_flow_configuration.learn_untagged_flow_vids");
        if (cli_parm != NULL)
        {
            val.learn_untagged_flow_vids = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "debug_flow_configuration.learn_untagged_flow_vids is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "debug_flow_configuration.untagged_flow_shaping_ms_per_sec");
        if (cli_parm != NULL)
        {
            val.untagged_flow_shaping_ms_per_sec = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "debug_flow_configuration.untagged_flow_shaping_ms_per_sec is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf, debug_flow_configuration, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_gpon_iwf_debug_flow_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_IWF_CFG_ID_DEBUG_FLOW_CONFIGURATION, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf, debug_flow_configuration, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "forbidden_vlan_flow_gem_range_start");
    if (cli_parm != NULL)
    {
        uint16_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf, forbidden_vlan_flow_gem_range_start, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf, forbidden_vlan_flow_gem_range_start, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_IWF_CFG_ID_FORBIDDEN_VLAN_FLOW_GEM_RANGE_START, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_cfg_set(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_set(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_iwf_cfg_clear(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_iwf_cfg cfg;        /**< declare main API struct */
    bcmolt_gpon_iwf_key key = { };  /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_iwf_cfg cfg;\n");
    bcmcli_log("bcmolt_gpon_iwf_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_clear");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_IWF_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, gpon_iwf, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, gpon_iwf, key);\n");

    /* call API */
    err = bcmolt_cfg_clear(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_clear(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_iwf_cfg_get_multi(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_iwf_cfg cfg;        /**< declare main API struct */
    bcmolt_gpon_iwf_key key = { };  /**< declare key */
    bcmolt_msg_set *msg_set = NULL; /**< declare message set */
    uint32_t max_msgs;              /**< declare max number of msgs to get */
    bcmos_bool invert_filter;       /**< declare filter invert flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_iwf_cfg cfg;\n");
    bcmcli_log("bcmolt_gpon_iwf_key key = {  };\n");
    bcmcli_log("bcmolt_msg_set* msg_set = NULL;\n");
    bcmcli_log("uint32_t max_msgs;\n");
    bcmcli_log("bcmos_bool invert_filter;\n");
    apicli_print_start(session, "bcmolt_cfg_get_multi");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_IWF_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* set max number of msgs from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "max_msgs");
    if (cli_parm != NULL)
    {
        max_msgs = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "max_msgs is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("max_msgs = %d;\n", max_msgs);

    /* set filter invert flag from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "filter_invert");
    if (cli_parm != NULL)
    {
        invert_filter = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "filter_invert is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("invert_filter = %s;\n", (invert_filter) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* allocate message set */
    err = apicli_msg_set_alloc(byte_pool, BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);
    if (err != BCM_ERR_OK)
    {
        return err;
    }

    bcmcli_log("bcmolt_msg_set_alloc(BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, gpon_iwf, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, gpon_iwf, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "filter.iwf_mode");
    if (cli_parm != NULL)
    {
        bcmolt_iwf_mode val;
        val = (bcmolt_iwf_mode) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf, iwf_mode, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf, iwf_mode, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_IWF_CFG_ID_IWF_MODE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "iwf_mode");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf, iwf_mode);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf, iwf_mode);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.us_tpid_per_flow.");
    if (cli_parm != NULL)
    {
        bcmolt_arr_u16_2_hex val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.us_tpid_per_flow.arr");
        if (cli_parm != NULL)
        {
            int32_t i0;
            if (cli_parm->array_size != 2)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "array filter.us_tpid_per_flow.arr must have 2 elements\n");
                return BCM_ERR_PARM;
            }

            for (i0 = 0; i0 < 2; i0++)
            {
                val.arr[i0] = cli_parm->values[i0].unumber;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.us_tpid_per_flow.arr is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf, us_tpid_per_flow, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_arr_u16_2_hex val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_IWF_CFG_ID_US_TPID_PER_FLOW, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf, us_tpid_per_flow, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "us_tpid_per_flow");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf, us_tpid_per_flow);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf, us_tpid_per_flow);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.us_otag_direct_tpid");
    if (cli_parm != NULL)
    {
        uint16_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf, us_otag_direct_tpid, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf, us_otag_direct_tpid, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_IWF_CFG_ID_US_OTAG_DIRECT_TPID, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "us_otag_direct_tpid");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf, us_otag_direct_tpid);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf, us_otag_direct_tpid);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.us_otag_direct_pbit");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf, us_otag_direct_pbit, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf, us_otag_direct_pbit, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_IWF_CFG_ID_US_OTAG_DIRECT_PBIT, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "us_otag_direct_pbit");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf, us_otag_direct_pbit);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf, us_otag_direct_pbit);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.ds_tpid.");
    if (cli_parm != NULL)
    {
        bcmolt_arr_u16_5_hex val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.ds_tpid.arr");
        if (cli_parm != NULL)
        {
            int32_t i1;
            if (cli_parm->array_size != 5)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "array filter.ds_tpid.arr must have 5 elements\n");
                return BCM_ERR_PARM;
            }

            for (i1 = 0; i1 < 5; i1++)
            {
                val.arr[i1] = cli_parm->values[i1].unumber;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ds_tpid.arr is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf, ds_tpid, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_arr_u16_5_hex val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_IWF_CFG_ID_DS_TPID, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf, ds_tpid, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "ds_tpid");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf, ds_tpid);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf, ds_tpid);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.mac_table_configuration.");
    if (cli_parm != NULL)
    {
        bcmolt_mac_table_configuration val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.mac_table_configuration.miss_fallback");
        if (cli_parm != NULL)
        {
            val.miss_fallback = (bcmolt_mac_table_miss_fallback) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.mac_table_configuration.miss_fallback is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.mac_table_configuration.default_flow_id");
        if (cli_parm != NULL)
        {
            val.default_flow_id = (bcmolt_flow_id) cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.mac_table_configuration.default_flow_id is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.mac_table_configuration.aging_time");
        if (cli_parm != NULL)
        {
            val.aging_time = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.mac_table_configuration.aging_time is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.mac_table_configuration.learning_mode");
        if (cli_parm != NULL)
        {
            val.learning_mode = (bcmolt_mac_table_learning_mode) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.mac_table_configuration.learning_mode is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.mac_table_configuration.automatic_mac_learning");
        if (cli_parm != NULL)
        {
            val.automatic_mac_learning = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.mac_table_configuration.automatic_mac_learning is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.mac_table_configuration.automatic_mac_aging");
        if (cli_parm != NULL)
        {
            val.automatic_mac_aging = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.mac_table_configuration.automatic_mac_aging is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.mac_table_configuration.automatic_mac_move");
        if (cli_parm != NULL)
        {
            val.automatic_mac_move = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.mac_table_configuration.automatic_mac_move is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.mac_table_configuration.automatic_static_mode");
        if (cli_parm != NULL)
        {
            val.automatic_static_mode = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.mac_table_configuration.automatic_static_mode is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf, mac_table_configuration, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_mac_table_configuration val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_IWF_CFG_ID_MAC_TABLE_CONFIGURATION, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf, mac_table_configuration, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "mac_table_configuration");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf, mac_table_configuration);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf, mac_table_configuration);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.debug_flow_configuration.");
    if (cli_parm != NULL)
    {
        bcmolt_gpon_iwf_debug_flow_config val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.debug_flow_configuration.learn_untagged_flow_vids");
        if (cli_parm != NULL)
        {
            val.learn_untagged_flow_vids = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.debug_flow_configuration.learn_untagged_flow_vids is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.debug_flow_configuration.untagged_flow_shaping_ms_per_sec");
        if (cli_parm != NULL)
        {
            val.untagged_flow_shaping_ms_per_sec = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.debug_flow_configuration.untagged_flow_shaping_ms_per_sec is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf, debug_flow_configuration, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_gpon_iwf_debug_flow_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_IWF_CFG_ID_DEBUG_FLOW_CONFIGURATION, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf, debug_flow_configuration, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "debug_flow_configuration");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf, debug_flow_configuration);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf, debug_flow_configuration);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.mac_table_count");
    if (cli_parm != NULL)
    {
        uint16_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf, mac_table_count, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf, mac_table_count, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_IWF_CFG_ID_MAC_TABLE_COUNT, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "mac_table_count");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf, mac_table_count);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf, mac_table_count);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.forbidden_vlan_flow_gem_range_start");
    if (cli_parm != NULL)
    {
        uint16_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf, forbidden_vlan_flow_gem_range_start, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf, forbidden_vlan_flow_gem_range_start, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_IWF_CFG_ID_FORBIDDEN_VLAN_FLOW_GEM_RANGE_START, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "forbidden_vlan_flow_gem_range_start");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf, forbidden_vlan_flow_gem_range_start);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf, forbidden_vlan_flow_gem_range_start);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_iwf, iwf_mode) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_iwf, us_tpid_per_flow) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_iwf, us_otag_direct_tpid) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_iwf, us_otag_direct_pbit) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_iwf, ds_tpid) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_iwf, mac_table_configuration) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_iwf, debug_flow_configuration) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_iwf, mac_table_count) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_iwf, forbidden_vlan_flow_gem_range_start))
    {
        BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf, all_properties);
        bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);
    bcmcli_log("bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_iwf_stat_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_iwf_stat stat;      /**< declare main API struct */
    bcmolt_gpon_iwf_key key = { };  /**< declare key */
    bcmos_bool clear_on_read;       /**< declare 'clear on read' flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_iwf_stat stat;\n");
    bcmcli_log("bcmolt_gpon_iwf_key key = {  };\n");
    bcmcli_log("bcmos_bool clear_on_read;\n");
    apicli_print_start(session, "bcmolt_stat_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_IWF_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* set stat flags from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "clear");
    if (cli_parm != NULL)
    {
        clear_on_read = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "clear is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("clear_on_read = %s;\n", (clear_on_read) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* init the API struct */
    BCMOLT_STAT_INIT(&stat, gpon_iwf, key);
    bcmcli_log("BCMOLT_STAT_INIT(&stat, gpon_iwf, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "ds_hit_event");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_iwf, ds_hit_event);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_iwf, ds_hit_event);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "ds_miss_event");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_iwf, ds_miss_event);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_iwf, ds_miss_event);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "ds_drop_due_to_miss_event");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_iwf, ds_drop_due_to_miss_event);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_iwf, ds_drop_due_to_miss_event);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "ds_drop_due_to_hit_event");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_iwf, ds_drop_due_to_hit_event);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_iwf, ds_drop_due_to_hit_event);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "ds_drop_to_disabled_gem");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_iwf, ds_drop_to_disabled_gem);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_iwf, ds_drop_to_disabled_gem);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "new_mac_discovered");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_iwf, new_mac_discovered);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_iwf, new_mac_discovered);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "move_event");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_iwf, move_event);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_iwf, move_event);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "new_mac_drop_due_to_fifo_full");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_iwf, new_mac_drop_due_to_fifo_full);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_iwf, new_mac_drop_due_to_fifo_full);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_STAT_PROP_IS_SET(&stat, gpon_iwf, ds_hit_event) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_iwf, ds_miss_event) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_iwf, ds_drop_due_to_miss_event) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_iwf, ds_drop_due_to_hit_event) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_iwf, ds_drop_to_disabled_gem) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_iwf, new_mac_discovered) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_iwf, move_event) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_iwf, new_mac_drop_due_to_fifo_full))
    {
        BCMOLT_STAT_PROP_GET(&stat, gpon_iwf, all_properties);
        bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_iwf, all_properties);\n");
    }

    /* call API */
    err = bcmolt_stat_get(device_id, &stat.hdr, clear_on_read);
    bcmcli_log("bcmolt_stat_get(device_id, &stat.hdr, clear_on_read);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &stat.hdr.hdr);
    }

    apicli_print_complete(session, err, stat.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_iwf_oper_flush_mac_table_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_iwf_flush_mac_table oper;   /**< declare main API struct */
    bcmolt_gpon_iwf_key key = { };          /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_iwf_flush_mac_table oper;\n");
    bcmcli_log("bcmolt_gpon_iwf_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_IWF_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, gpon_iwf, flush_mac_table, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, gpon_iwf, flush_mac_table, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "control");
    if (cli_parm != NULL)
    {
        bcmolt_flush_mac_table_option val;
        val = (bcmolt_flush_mac_table_option) cli_parm->value.enum_val;
        BCMOLT_OPER_PROP_SET(&oper, gpon_iwf, flush_mac_table, control, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, gpon_iwf, flush_mac_table, control, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_OPER, BCMOLT_GPON_IWF_OPER_ID_FLUSH_MAC_TABLE, BCMOLT_GPON_IWF_FLUSH_MAC_TABLE_ID_CONTROL, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "vid");
    if (cli_parm != NULL)
    {
        bcmolt_vlan_id val;
        val = (bcmolt_vlan_id) cli_parm->value.unumber;
        BCMOLT_OPER_PROP_SET(&oper, gpon_iwf, flush_mac_table, vid, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, gpon_iwf, flush_mac_table, vid, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_OPER, BCMOLT_GPON_IWF_OPER_ID_FLUSH_MAC_TABLE, BCMOLT_GPON_IWF_FLUSH_MAC_TABLE_ID_VID, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "flow_id");
    if (cli_parm != NULL)
    {
        bcmolt_flow_id val;
        val = (bcmolt_flow_id) cli_parm->value.unumber;
        BCMOLT_OPER_PROP_SET(&oper, gpon_iwf, flush_mac_table, flow_id, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, gpon_iwf, flush_mac_table, flow_id, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_OPER, BCMOLT_GPON_IWF_OPER_ID_FLUSH_MAC_TABLE, BCMOLT_GPON_IWF_FLUSH_MAC_TABLE_ID_FLOW_ID, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_iwf_oper_scan_mac_table_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_iwf_scan_mac_table oper;    /**< declare main API struct */
    bcmolt_gpon_iwf_key key = { };          /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_iwf_scan_mac_table oper;\n");
    bcmcli_log("bcmolt_gpon_iwf_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_IWF_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, gpon_iwf, scan_mac_table, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, gpon_iwf, scan_mac_table, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "mac_address");
    if (cli_parm != NULL)
    {
        bcmos_mac_address val;
        val = cli_parm->value.mac;
        BCMOLT_OPER_PROP_SET(&oper, gpon_iwf, scan_mac_table, mac_address, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, gpon_iwf, scan_mac_table, mac_address, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_OPER, BCMOLT_GPON_IWF_OPER_ID_SCAN_MAC_TABLE, BCMOLT_GPON_IWF_SCAN_MAC_TABLE_ID_MAC_ADDRESS, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_iwf_stat_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_iwf_stat_cfg stat_cfg;  /**< declare main API struct */
    bcmolt_gpon_iwf_key key = { };      /**< declare key */
    bcmolt_gpon_iwf_stat_id stat_id;    /**< declare stat ID */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_iwf_stat_cfg stat_cfg;\n");
    bcmcli_log("bcmolt_gpon_iwf_key key = {  };\n");
    apicli_print_start(session, "bcmolt_stat_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_IWF_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* set stat ID from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "sub");
    if (cli_parm != NULL)
    {
        stat_id = (bcmolt_gpon_iwf_stat_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
        return BCM_ERR_PARM;
    }

    /* init the API struct */
    switch (stat_id)
    {
        case BCMOLT_GPON_IWF_STAT_ID_DS_HIT_EVENT:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_iwf, ds_hit_event, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_iwf, ds_hit_event, key);\n");
            break;
        case BCMOLT_GPON_IWF_STAT_ID_DS_MISS_EVENT:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_iwf, ds_miss_event, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_iwf, ds_miss_event, key);\n");
            break;
        case BCMOLT_GPON_IWF_STAT_ID_DS_DROP_DUE_TO_MISS_EVENT:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_iwf, ds_drop_due_to_miss_event, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_iwf, ds_drop_due_to_miss_event, key);\n");
            break;
        case BCMOLT_GPON_IWF_STAT_ID_DS_DROP_DUE_TO_HIT_EVENT:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_iwf, ds_drop_due_to_hit_event, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_iwf, ds_drop_due_to_hit_event, key);\n");
            break;
        case BCMOLT_GPON_IWF_STAT_ID_DS_DROP_TO_DISABLED_GEM:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_iwf, ds_drop_to_disabled_gem, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_iwf, ds_drop_to_disabled_gem, key);\n");
            break;
        case BCMOLT_GPON_IWF_STAT_ID_NEW_MAC_DISCOVERED:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_iwf, new_mac_discovered, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_iwf, new_mac_discovered, key);\n");
            break;
        case BCMOLT_GPON_IWF_STAT_ID_MOVE_EVENT:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_iwf, move_event, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_iwf, move_event, key);\n");
            break;
        case BCMOLT_GPON_IWF_STAT_ID_NEW_MAC_DROP_DUE_TO_FIFO_FULL:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_iwf, new_mac_drop_due_to_fifo_full, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_iwf, new_mac_drop_due_to_fifo_full, key);\n");
            break;
        default:
            apicli_print_complete(session, BCM_ERR_RANGE, "\n");
            return BCM_ERR_RANGE;
    }

    /* call API */
    err = bcmolt_stat_cfg_get(device_id, &stat_cfg.hdr);
    bcmcli_log("bcmolt_stat_cfg_get(device_id, &stat_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &stat_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, stat_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_iwf_stat_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_iwf_stat_cfg stat_cfg;  /**< declare main API struct */
    bcmolt_gpon_iwf_key key = { };      /**< declare key */
    bcmolt_gpon_iwf_stat_id stat_id;    /**< declare stat ID */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_iwf_stat_cfg stat_cfg;\n");
    bcmcli_log("bcmolt_gpon_iwf_key key = {  };\n");
    apicli_print_start(session, "bcmolt_stat_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_IWF_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* set stat ID from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "sub");
    if (cli_parm != NULL)
    {
        stat_id = (bcmolt_gpon_iwf_stat_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
        return BCM_ERR_PARM;
    }

    /* init the API struct */
    switch (stat_id)
    {
        case BCMOLT_GPON_IWF_STAT_ID_DS_HIT_EVENT:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_iwf, ds_hit_event, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_iwf, ds_hit_event, key);\n");
            break;
        case BCMOLT_GPON_IWF_STAT_ID_DS_MISS_EVENT:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_iwf, ds_miss_event, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_iwf, ds_miss_event, key);\n");
            break;
        case BCMOLT_GPON_IWF_STAT_ID_DS_DROP_DUE_TO_MISS_EVENT:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_iwf, ds_drop_due_to_miss_event, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_iwf, ds_drop_due_to_miss_event, key);\n");
            break;
        case BCMOLT_GPON_IWF_STAT_ID_DS_DROP_DUE_TO_HIT_EVENT:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_iwf, ds_drop_due_to_hit_event, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_iwf, ds_drop_due_to_hit_event, key);\n");
            break;
        case BCMOLT_GPON_IWF_STAT_ID_DS_DROP_TO_DISABLED_GEM:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_iwf, ds_drop_to_disabled_gem, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_iwf, ds_drop_to_disabled_gem, key);\n");
            break;
        case BCMOLT_GPON_IWF_STAT_ID_NEW_MAC_DISCOVERED:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_iwf, new_mac_discovered, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_iwf, new_mac_discovered, key);\n");
            break;
        case BCMOLT_GPON_IWF_STAT_ID_MOVE_EVENT:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_iwf, move_event, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_iwf, move_event, key);\n");
            break;
        case BCMOLT_GPON_IWF_STAT_ID_NEW_MAC_DROP_DUE_TO_FIFO_FULL:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_iwf, new_mac_drop_due_to_fifo_full, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_iwf, new_mac_drop_due_to_fifo_full, key);\n");
            break;
        default:
            apicli_print_complete(session, BCM_ERR_RANGE, "\n");
            return BCM_ERR_RANGE;
    }

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.");
    if (cli_parm != NULL)
    {
        bcmolt_stat_alarm_config val = { };
        cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.trigger.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.type");
            if (cli_parm != NULL)
            {
                val.trigger.type = (bcmolt_stat_condition_type) cli_parm->value.enum_val;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.type is not set\n");
                return BCM_ERR_PARM;
            }

            switch (val.trigger.type)
            {
                case BCMOLT_STAT_CONDITION_TYPE_RATE_THRESHOLD:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.rising");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_threshold.rising = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.rising is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.falling");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_threshold.falling = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.falling is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_RATE_RANGE:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.upper");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_range.upper = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.upper is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.lower");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_range.lower = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.lower is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_VALUE_THRESHOLD:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.limit");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.value_threshold.limit = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.limit is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_NONE:
                    break;
                default:
                    apicli_print_complete(session, BCM_ERR_RANGE, "\n");
                    return BCM_ERR_RANGE;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.soak.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "cfg.soak.active_soak_time");
            if (cli_parm != NULL)
            {
                val.soak.active_soak_time = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak.active_soak_time is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "cfg.soak.clear_soak_time");
            if (cli_parm != NULL)
            {
                val.soak.clear_soak_time = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak.clear_soak_time is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_STAT_CFG_PROP_SET(&stat_cfg, gpon_iwf, cfg, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_stat_alarm_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_STAT_CFG, 0, BCMOLT_GPON_IWF_STAT_CFG_ID_CFG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_STAT_CFG_PROP_SET(&stat_cfg, gpon_iwf, cfg, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_stat_cfg_set(device_id, &stat_cfg.hdr);
    bcmcli_log("bcmolt_stat_cfg_set(device_id, &stat_cfg.hdr);\n");
    apicli_print_complete(session, err, stat_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_iwf_auto_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_iwf_auto_cfg auto_cfg;  /**< declare main API struct */
    bcmolt_gpon_iwf_key key = { };      /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_iwf_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_gpon_iwf_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_get");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, gpon_iwf, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, gpon_iwf, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "flush_mac_table_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_iwf, flush_mac_table_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_iwf, flush_mac_table_completed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "scan_mac_table_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_iwf, scan_mac_table_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_iwf, scan_mac_table_completed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_cleared");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_iwf, stat_alarm_cleared);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_iwf, stat_alarm_cleared);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_raised");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_iwf, stat_alarm_raised);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_iwf, stat_alarm_raised);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_iwf, flush_mac_table_completed) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_iwf, scan_mac_table_completed) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_iwf, stat_alarm_cleared) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_iwf, stat_alarm_raised))
    {
        BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_iwf, all_properties);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_iwf, all_properties);\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &auto_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_iwf_auto_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_iwf_auto_cfg auto_cfg;  /**< declare main API struct */
    bcmolt_gpon_iwf_key key = { };      /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_iwf_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_gpon_iwf_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_set");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, gpon_iwf, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, gpon_iwf, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "flush_mac_table_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_iwf, flush_mac_table_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_iwf, flush_mac_table_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_IWF_AUTO_CFG_ID_FLUSH_MAC_TABLE_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "scan_mac_table_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_iwf, scan_mac_table_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_iwf, scan_mac_table_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_IWF_AUTO_CFG_ID_SCAN_MAC_TABLE_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_cleared");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_iwf, stat_alarm_cleared, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_iwf, stat_alarm_cleared, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_IWF_AUTO_CFG_ID_STAT_ALARM_CLEARED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_raised");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_iwf, stat_alarm_raised, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_iwf, stat_alarm_raised, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_IWF_AUTO_CFG_ID_STAT_ALARM_RAISED, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);\n");
    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_iwf_ds_egress_flow_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_iwf_ds_egress_flow_cfg cfg;         /**< declare main API struct */
    bcmolt_gpon_iwf_ds_egress_flow_key key = { };   /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_iwf_ds_egress_flow_cfg cfg;\n");
    bcmcli_log("bcmolt_gpon_iwf_ds_egress_flow_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_DS_EGRESS_FLOW, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_IWF_DS_EGRESS_FLOW_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "flow_id");
    if (cli_parm != NULL)
    {
        key.flow_id = (bcmolt_flow_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "flow_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.flow_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_DS_EGRESS_FLOW, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_IWF_DS_EGRESS_FLOW_KEY_ID_FLOW_ID, &key.flow_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, gpon_iwf_ds_egress_flow, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, gpon_iwf_ds_egress_flow, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "gem_port");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf_ds_egress_flow, gem_port);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf_ds_egress_flow, gem_port);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "pbit_control");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf_ds_egress_flow, pbit_control);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf_ds_egress_flow, pbit_control);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_iwf_ds_egress_flow, gem_port) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_iwf_ds_egress_flow, pbit_control))
    {
        BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf_ds_egress_flow, all_properties);
        bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf_ds_egress_flow, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_get(device_id, &cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_iwf_ds_egress_flow_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_iwf_ds_egress_flow_cfg cfg;         /**< declare main API struct */
    bcmolt_gpon_iwf_ds_egress_flow_key key = { };   /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_iwf_ds_egress_flow_cfg cfg;\n");
    bcmcli_log("bcmolt_gpon_iwf_ds_egress_flow_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_DS_EGRESS_FLOW, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_IWF_DS_EGRESS_FLOW_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "flow_id");
    if (cli_parm != NULL)
    {
        key.flow_id = (bcmolt_flow_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "flow_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.flow_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_DS_EGRESS_FLOW, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_IWF_DS_EGRESS_FLOW_KEY_ID_FLOW_ID, &key.flow_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, gpon_iwf_ds_egress_flow, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, gpon_iwf_ds_egress_flow, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "gem_port");
    if (cli_parm != NULL)
    {
        bcmolt_gpon_gem_id val;
        val = (bcmolt_gpon_gem_id) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_ds_egress_flow, gem_port, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_ds_egress_flow, gem_port, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_DS_EGRESS_FLOW, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_IWF_DS_EGRESS_FLOW_CFG_ID_GEM_PORT, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "pbit_control");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_ds_egress_flow, pbit_control, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_ds_egress_flow, pbit_control, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_DS_EGRESS_FLOW, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_IWF_DS_EGRESS_FLOW_CFG_ID_PBIT_CONTROL, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_cfg_set(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_set(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_iwf_ds_egress_flow_cfg_clear(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_iwf_ds_egress_flow_cfg cfg;         /**< declare main API struct */
    bcmolt_gpon_iwf_ds_egress_flow_key key = { };   /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_iwf_ds_egress_flow_cfg cfg;\n");
    bcmcli_log("bcmolt_gpon_iwf_ds_egress_flow_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_clear");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_DS_EGRESS_FLOW, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_IWF_DS_EGRESS_FLOW_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "flow_id");
    if (cli_parm != NULL)
    {
        key.flow_id = (bcmolt_flow_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "flow_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.flow_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_DS_EGRESS_FLOW, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_IWF_DS_EGRESS_FLOW_KEY_ID_FLOW_ID, &key.flow_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, gpon_iwf_ds_egress_flow, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, gpon_iwf_ds_egress_flow, key);\n");

    /* call API */
    err = bcmolt_cfg_clear(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_clear(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_iwf_ds_egress_flow_cfg_get_multi(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_iwf_ds_egress_flow_cfg cfg;         /**< declare main API struct */
    bcmolt_gpon_iwf_ds_egress_flow_key key = { };   /**< declare key */
    bcmolt_msg_set *msg_set = NULL;                 /**< declare message set */
    uint32_t max_msgs;          /**< declare max number of msgs to get */
    bcmos_bool invert_filter;   /**< declare filter invert flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_iwf_ds_egress_flow_cfg cfg;\n");
    bcmcli_log("bcmolt_gpon_iwf_ds_egress_flow_key key = {  };\n");
    bcmcli_log("bcmolt_msg_set* msg_set = NULL;\n");
    bcmcli_log("uint32_t max_msgs;\n");
    bcmcli_log("bcmos_bool invert_filter;\n");
    apicli_print_start(session, "bcmolt_cfg_get_multi");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_DS_EGRESS_FLOW, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_IWF_DS_EGRESS_FLOW_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "flow_id");
    if (cli_parm != NULL)
    {
        key.flow_id = (bcmolt_flow_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "flow_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.flow_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_DS_EGRESS_FLOW, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_IWF_DS_EGRESS_FLOW_KEY_ID_FLOW_ID, &key.flow_id);
    bcmcli_log(";\n");

    /* set max number of msgs from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "max_msgs");
    if (cli_parm != NULL)
    {
        max_msgs = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "max_msgs is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("max_msgs = %d;\n", max_msgs);

    /* set filter invert flag from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "filter_invert");
    if (cli_parm != NULL)
    {
        invert_filter = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "filter_invert is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("invert_filter = %s;\n", (invert_filter) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* allocate message set */
    err = apicli_msg_set_alloc(byte_pool, BCMOLT_OBJ_ID_GPON_IWF_DS_EGRESS_FLOW, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);
    if (err != BCM_ERR_OK)
    {
        return err;
    }

    bcmcli_log("bcmolt_msg_set_alloc(BCMOLT_OBJ_ID_GPON_IWF_DS_EGRESS_FLOW, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, gpon_iwf_ds_egress_flow, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, gpon_iwf_ds_egress_flow, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "filter.gem_port");
    if (cli_parm != NULL)
    {
        bcmolt_gpon_gem_id val;
        val = (bcmolt_gpon_gem_id) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_ds_egress_flow, gem_port, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_ds_egress_flow, gem_port, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_DS_EGRESS_FLOW, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_IWF_DS_EGRESS_FLOW_CFG_ID_GEM_PORT, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "gem_port");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf_ds_egress_flow, gem_port);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf_ds_egress_flow, gem_port);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.pbit_control");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_ds_egress_flow, pbit_control, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_ds_egress_flow, pbit_control, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_DS_EGRESS_FLOW, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_IWF_DS_EGRESS_FLOW_CFG_ID_PBIT_CONTROL, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "pbit_control");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf_ds_egress_flow, pbit_control);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf_ds_egress_flow, pbit_control);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_iwf_ds_egress_flow, gem_port) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_iwf_ds_egress_flow, pbit_control))
    {
        BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf_ds_egress_flow, all_properties);
        bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf_ds_egress_flow, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);
    bcmcli_log("bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_iwf_ds_ingress_flow_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_iwf_ds_ingress_flow_cfg cfg;        /**< declare main API struct */
    bcmolt_gpon_iwf_ds_ingress_flow_key key = { };  /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_iwf_ds_ingress_flow_cfg cfg;\n");
    bcmcli_log("bcmolt_gpon_iwf_ds_ingress_flow_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_DS_INGRESS_FLOW, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_IWF_DS_INGRESS_FLOW_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "vlan_id");
    if (cli_parm != NULL)
    {
        key.vlan_id = (bcmolt_vlan_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "vlan_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.vlan_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_DS_INGRESS_FLOW, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_IWF_DS_INGRESS_FLOW_KEY_ID_VLAN_ID, &key.vlan_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, gpon_iwf_ds_ingress_flow, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, gpon_iwf_ds_ingress_flow, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "mapping_method");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf_ds_ingress_flow, mapping_method);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf_ds_ingress_flow, mapping_method);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "mapping_tag");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf_ds_ingress_flow, mapping_tag);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf_ds_ingress_flow, mapping_tag);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "vlan_action");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf_ds_ingress_flow, vlan_action);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf_ds_ingress_flow, vlan_action);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_iwf_ds_ingress_flow, mapping_method) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_iwf_ds_ingress_flow, mapping_tag) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_iwf_ds_ingress_flow, vlan_action))
    {
        BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf_ds_ingress_flow, all_properties);
        bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf_ds_ingress_flow, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_get(device_id, &cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_iwf_ds_ingress_flow_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_iwf_ds_ingress_flow_cfg cfg;        /**< declare main API struct */
    bcmolt_gpon_iwf_ds_ingress_flow_key key = { };  /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_iwf_ds_ingress_flow_cfg cfg;\n");
    bcmcli_log("bcmolt_gpon_iwf_ds_ingress_flow_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_DS_INGRESS_FLOW, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_IWF_DS_INGRESS_FLOW_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "vlan_id");
    if (cli_parm != NULL)
    {
        key.vlan_id = (bcmolt_vlan_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "vlan_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.vlan_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_DS_INGRESS_FLOW, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_IWF_DS_INGRESS_FLOW_KEY_ID_VLAN_ID, &key.vlan_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, gpon_iwf_ds_ingress_flow, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, gpon_iwf_ds_ingress_flow, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "mapping_method");
    if (cli_parm != NULL)
    {
        bcmolt_vlan_to_flow_mapping_method val;
        val = (bcmolt_vlan_to_flow_mapping_method) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_ds_ingress_flow, mapping_method, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_ds_ingress_flow, mapping_method, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_DS_INGRESS_FLOW, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_IWF_DS_INGRESS_FLOW_CFG_ID_MAPPING_METHOD, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "mapping_tag");
    if (cli_parm != NULL)
    {
        bcmolt_mapping_tag_method val;
        val = (bcmolt_mapping_tag_method) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_ds_ingress_flow, mapping_tag, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_ds_ingress_flow, mapping_tag, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_DS_INGRESS_FLOW, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_IWF_DS_INGRESS_FLOW_CFG_ID_MAPPING_TAG, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "vlan_action");
    if (cli_parm != NULL)
    {
        bcmolt_ds_vlan_action val;
        val = (bcmolt_ds_vlan_action) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_ds_ingress_flow, vlan_action, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_ds_ingress_flow, vlan_action, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_DS_INGRESS_FLOW, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_IWF_DS_INGRESS_FLOW_CFG_ID_VLAN_ACTION, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_cfg_set(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_set(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_iwf_ds_ingress_flow_cfg_clear(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_iwf_ds_ingress_flow_cfg cfg;        /**< declare main API struct */
    bcmolt_gpon_iwf_ds_ingress_flow_key key = { };  /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_iwf_ds_ingress_flow_cfg cfg;\n");
    bcmcli_log("bcmolt_gpon_iwf_ds_ingress_flow_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_clear");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_DS_INGRESS_FLOW, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_IWF_DS_INGRESS_FLOW_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "vlan_id");
    if (cli_parm != NULL)
    {
        key.vlan_id = (bcmolt_vlan_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "vlan_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.vlan_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_DS_INGRESS_FLOW, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_IWF_DS_INGRESS_FLOW_KEY_ID_VLAN_ID, &key.vlan_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, gpon_iwf_ds_ingress_flow, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, gpon_iwf_ds_ingress_flow, key);\n");

    /* call API */
    err = bcmolt_cfg_clear(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_clear(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_iwf_ds_ingress_flow_cfg_get_multi(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_iwf_ds_ingress_flow_cfg cfg;        /**< declare main API struct */
    bcmolt_gpon_iwf_ds_ingress_flow_key key = { };  /**< declare key */
    bcmolt_msg_set *msg_set = NULL;                 /**< declare message set */
    uint32_t max_msgs;          /**< declare max number of msgs to get */
    bcmos_bool invert_filter;   /**< declare filter invert flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_iwf_ds_ingress_flow_cfg cfg;\n");
    bcmcli_log("bcmolt_gpon_iwf_ds_ingress_flow_key key = {  };\n");
    bcmcli_log("bcmolt_msg_set* msg_set = NULL;\n");
    bcmcli_log("uint32_t max_msgs;\n");
    bcmcli_log("bcmos_bool invert_filter;\n");
    apicli_print_start(session, "bcmolt_cfg_get_multi");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_DS_INGRESS_FLOW, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_IWF_DS_INGRESS_FLOW_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "vlan_id");
    if (cli_parm != NULL)
    {
        key.vlan_id = (bcmolt_vlan_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "vlan_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.vlan_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_DS_INGRESS_FLOW, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_IWF_DS_INGRESS_FLOW_KEY_ID_VLAN_ID, &key.vlan_id);
    bcmcli_log(";\n");

    /* set max number of msgs from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "max_msgs");
    if (cli_parm != NULL)
    {
        max_msgs = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "max_msgs is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("max_msgs = %d;\n", max_msgs);

    /* set filter invert flag from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "filter_invert");
    if (cli_parm != NULL)
    {
        invert_filter = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "filter_invert is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("invert_filter = %s;\n", (invert_filter) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* allocate message set */
    err = apicli_msg_set_alloc(byte_pool, BCMOLT_OBJ_ID_GPON_IWF_DS_INGRESS_FLOW, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);
    if (err != BCM_ERR_OK)
    {
        return err;
    }

    bcmcli_log("bcmolt_msg_set_alloc(BCMOLT_OBJ_ID_GPON_IWF_DS_INGRESS_FLOW, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, gpon_iwf_ds_ingress_flow, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, gpon_iwf_ds_ingress_flow, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "filter.mapping_method");
    if (cli_parm != NULL)
    {
        bcmolt_vlan_to_flow_mapping_method val;
        val = (bcmolt_vlan_to_flow_mapping_method) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_ds_ingress_flow, mapping_method, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_ds_ingress_flow, mapping_method, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_DS_INGRESS_FLOW, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_IWF_DS_INGRESS_FLOW_CFG_ID_MAPPING_METHOD, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "mapping_method");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf_ds_ingress_flow, mapping_method);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf_ds_ingress_flow, mapping_method);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.mapping_tag");
    if (cli_parm != NULL)
    {
        bcmolt_mapping_tag_method val;
        val = (bcmolt_mapping_tag_method) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_ds_ingress_flow, mapping_tag, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_ds_ingress_flow, mapping_tag, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_DS_INGRESS_FLOW, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_IWF_DS_INGRESS_FLOW_CFG_ID_MAPPING_TAG, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "mapping_tag");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf_ds_ingress_flow, mapping_tag);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf_ds_ingress_flow, mapping_tag);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.vlan_action");
    if (cli_parm != NULL)
    {
        bcmolt_ds_vlan_action val;
        val = (bcmolt_ds_vlan_action) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_ds_ingress_flow, vlan_action, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_ds_ingress_flow, vlan_action, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_DS_INGRESS_FLOW, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_IWF_DS_INGRESS_FLOW_CFG_ID_VLAN_ACTION, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "vlan_action");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf_ds_ingress_flow, vlan_action);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf_ds_ingress_flow, vlan_action);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_iwf_ds_ingress_flow, mapping_method) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_iwf_ds_ingress_flow, mapping_tag) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_iwf_ds_ingress_flow, vlan_action))
    {
        BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf_ds_ingress_flow, all_properties);
        bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf_ds_ingress_flow, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);
    bcmcli_log("bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_iwf_mac_table_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_iwf_mac_table_cfg cfg;  /**< declare main API struct */
    bcmolt_gpon_iwf_mac_table_key key = { };    /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_iwf_mac_table_cfg cfg;\n");
    bcmcli_log("bcmolt_gpon_iwf_mac_table_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_MAC_TABLE, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_IWF_MAC_TABLE_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "mac_address");
    if (cli_parm != NULL)
    {
        key.mac_address = cli_parm->value.mac;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "mac_address is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.mac_address = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_MAC_TABLE, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_IWF_MAC_TABLE_KEY_ID_MAC_ADDRESS, &key.mac_address);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "vlan");
    if (cli_parm != NULL)
    {
        key.vlan = (bcmolt_vlan_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "vlan is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.vlan = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_MAC_TABLE, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_IWF_MAC_TABLE_KEY_ID_VLAN, &key.vlan);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, gpon_iwf_mac_table, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, gpon_iwf_mac_table, 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)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf_mac_table, flow_id);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf_mac_table, flow_id);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "stat");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf_mac_table, stat);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf_mac_table, stat);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "gem_port_id");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf_mac_table, gem_port_id);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf_mac_table, gem_port_id);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf_mac_table, onu_id);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf_mac_table, onu_id);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_iwf_mac_table, flow_id) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_iwf_mac_table, stat) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_iwf_mac_table, gem_port_id) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_iwf_mac_table, onu_id))
    {
        BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf_mac_table, all_properties);
        bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf_mac_table, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_get(device_id, &cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_iwf_mac_table_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_iwf_mac_table_cfg cfg;          /**< declare main API struct */
    bcmolt_gpon_iwf_mac_table_key key = { };    /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_iwf_mac_table_cfg cfg;\n");
    bcmcli_log("bcmolt_gpon_iwf_mac_table_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_MAC_TABLE, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_IWF_MAC_TABLE_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "mac_address");
    if (cli_parm != NULL)
    {
        key.mac_address = cli_parm->value.mac;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "mac_address is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.mac_address = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_MAC_TABLE, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_IWF_MAC_TABLE_KEY_ID_MAC_ADDRESS, &key.mac_address);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "vlan");
    if (cli_parm != NULL)
    {
        key.vlan = (bcmolt_vlan_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "vlan is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.vlan = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_MAC_TABLE, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_IWF_MAC_TABLE_KEY_ID_VLAN, &key.vlan);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, gpon_iwf_mac_table, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, gpon_iwf_mac_table, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "flow_id");
    if (cli_parm != NULL)
    {
        bcmolt_flow_id val;
        val = (bcmolt_flow_id) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_mac_table, flow_id, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_mac_table, flow_id, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_MAC_TABLE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_IWF_MAC_TABLE_CFG_ID_FLOW_ID, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "stat");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_mac_table, stat, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_mac_table, stat, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_MAC_TABLE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_IWF_MAC_TABLE_CFG_ID_STAT, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_cfg_set(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_set(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_iwf_mac_table_cfg_clear(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_iwf_mac_table_cfg cfg;          /**< declare main API struct */
    bcmolt_gpon_iwf_mac_table_key key = { };    /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_iwf_mac_table_cfg cfg;\n");
    bcmcli_log("bcmolt_gpon_iwf_mac_table_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_clear");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_MAC_TABLE, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_IWF_MAC_TABLE_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "mac_address");
    if (cli_parm != NULL)
    {
        key.mac_address = cli_parm->value.mac;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "mac_address is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.mac_address = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_MAC_TABLE, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_IWF_MAC_TABLE_KEY_ID_MAC_ADDRESS, &key.mac_address);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "vlan");
    if (cli_parm != NULL)
    {
        key.vlan = (bcmolt_vlan_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "vlan is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.vlan = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_MAC_TABLE, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_IWF_MAC_TABLE_KEY_ID_VLAN, &key.vlan);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, gpon_iwf_mac_table, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, gpon_iwf_mac_table, key);\n");

    /* call API */
    err = bcmolt_cfg_clear(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_clear(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_iwf_mac_table_cfg_get_multi(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_iwf_mac_table_cfg cfg;          /**< declare main API struct */
    bcmolt_gpon_iwf_mac_table_key key = { };    /**< declare key */
    bcmolt_msg_set *msg_set = NULL;             /**< declare message set */
    uint32_t max_msgs;          /**< declare max number of msgs to get */
    bcmos_bool invert_filter;   /**< declare filter invert flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_iwf_mac_table_cfg cfg;\n");
    bcmcli_log("bcmolt_gpon_iwf_mac_table_key key = {  };\n");
    bcmcli_log("bcmolt_msg_set* msg_set = NULL;\n");
    bcmcli_log("uint32_t max_msgs;\n");
    bcmcli_log("bcmos_bool invert_filter;\n");
    apicli_print_start(session, "bcmolt_cfg_get_multi");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_MAC_TABLE, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_IWF_MAC_TABLE_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "mac_address");
    if (cli_parm != NULL)
    {
        key.mac_address = cli_parm->value.mac;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "mac_address is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.mac_address = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_MAC_TABLE, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_IWF_MAC_TABLE_KEY_ID_MAC_ADDRESS, &key.mac_address);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "vlan");
    if (cli_parm != NULL)
    {
        key.vlan = (bcmolt_vlan_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "vlan is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.vlan = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_MAC_TABLE, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_IWF_MAC_TABLE_KEY_ID_VLAN, &key.vlan);
    bcmcli_log(";\n");

    /* set max number of msgs from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "max_msgs");
    if (cli_parm != NULL)
    {
        max_msgs = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "max_msgs is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("max_msgs = %d;\n", max_msgs);

    /* set filter invert flag from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "filter_invert");
    if (cli_parm != NULL)
    {
        invert_filter = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "filter_invert is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("invert_filter = %s;\n", (invert_filter) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* allocate message set */
    err = apicli_msg_set_alloc(byte_pool, BCMOLT_OBJ_ID_GPON_IWF_MAC_TABLE, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);
    if (err != BCM_ERR_OK)
    {
        return err;
    }

    bcmcli_log("bcmolt_msg_set_alloc(BCMOLT_OBJ_ID_GPON_IWF_MAC_TABLE, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, gpon_iwf_mac_table, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, gpon_iwf_mac_table, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "filter.flow_id");
    if (cli_parm != NULL)
    {
        bcmolt_flow_id val;
        val = (bcmolt_flow_id) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_mac_table, flow_id, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_mac_table, flow_id, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_MAC_TABLE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_IWF_MAC_TABLE_CFG_ID_FLOW_ID, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "flow_id");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf_mac_table, flow_id);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf_mac_table, flow_id);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.stat");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_mac_table, stat, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_mac_table, stat, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_MAC_TABLE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_IWF_MAC_TABLE_CFG_ID_STAT, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "stat");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf_mac_table, stat);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf_mac_table, stat);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.gem_port_id");
    if (cli_parm != NULL)
    {
        bcmolt_gpon_gem_id val;
        val = (bcmolt_gpon_gem_id) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_mac_table, gem_port_id, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_mac_table, gem_port_id, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_MAC_TABLE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_IWF_MAC_TABLE_CFG_ID_GEM_PORT_ID, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "gem_port_id");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf_mac_table, gem_port_id);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf_mac_table, gem_port_id);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.onu_id");
    if (cli_parm != NULL)
    {
        bcmolt_gpon_onu_id val;
        val = (bcmolt_gpon_onu_id) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_mac_table, onu_id, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_mac_table, onu_id, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_MAC_TABLE, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_IWF_MAC_TABLE_CFG_ID_ONU_ID, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf_mac_table, onu_id);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf_mac_table, onu_id);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_iwf_mac_table, flow_id) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_iwf_mac_table, stat) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_iwf_mac_table, gem_port_id) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_iwf_mac_table, onu_id))
    {
        BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf_mac_table, all_properties);
        bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf_mac_table, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);
    bcmcli_log("bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_iwf_mac_table_auto_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_iwf_mac_table_auto_cfg auto_cfg;    /**< declare main API struct */
    bcmolt_gpon_iwf_mac_table_key key = { };        /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_iwf_mac_table_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_gpon_iwf_mac_table_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_get");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, gpon_iwf_mac_table, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, gpon_iwf_mac_table, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "mac_aged");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_iwf_mac_table, mac_aged);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_iwf_mac_table, mac_aged);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "mac_dropped");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_iwf_mac_table, mac_dropped);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_iwf_mac_table, mac_dropped);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "mac_move");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_iwf_mac_table, mac_move);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_iwf_mac_table, mac_move);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "new_mac");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_iwf_mac_table, new_mac);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_iwf_mac_table, new_mac);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_iwf_mac_table, mac_aged) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_iwf_mac_table, mac_dropped) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_iwf_mac_table, mac_move) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_iwf_mac_table, new_mac))
    {
        BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_iwf_mac_table, all_properties);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_iwf_mac_table, all_properties);\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &auto_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_iwf_mac_table_auto_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_iwf_mac_table_auto_cfg auto_cfg;    /**< declare main API struct */
    bcmolt_gpon_iwf_mac_table_key key = { };        /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_iwf_mac_table_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_gpon_iwf_mac_table_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_set");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, gpon_iwf_mac_table, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, gpon_iwf_mac_table, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "mac_aged");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_iwf_mac_table, mac_aged, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_iwf_mac_table, mac_aged, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_MAC_TABLE, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_IWF_MAC_TABLE_AUTO_CFG_ID_MAC_AGED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "mac_dropped");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_iwf_mac_table, mac_dropped, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_iwf_mac_table, mac_dropped, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_MAC_TABLE, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_IWF_MAC_TABLE_AUTO_CFG_ID_MAC_DROPPED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "mac_move");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_iwf_mac_table, mac_move, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_iwf_mac_table, mac_move, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_MAC_TABLE, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_IWF_MAC_TABLE_AUTO_CFG_ID_MAC_MOVE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "new_mac");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_iwf_mac_table, new_mac, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_iwf_mac_table, new_mac, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_MAC_TABLE, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_IWF_MAC_TABLE_AUTO_CFG_ID_NEW_MAC, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);\n");
    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_iwf_us_flow_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_iwf_us_flow_cfg cfg;        /**< declare main API struct */
    bcmolt_gpon_iwf_us_flow_key key = { };  /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_iwf_us_flow_cfg cfg;\n");
    bcmcli_log("bcmolt_gpon_iwf_us_flow_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_US_FLOW, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_IWF_US_FLOW_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "gem_port_id");
    if (cli_parm != NULL)
    {
        key.gem_port_id = (bcmolt_gpon_gem_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "gem_port_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.gem_port_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_US_FLOW, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_IWF_US_FLOW_KEY_ID_GEM_PORT_ID, &key.gem_port_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, gpon_iwf_us_flow, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, gpon_iwf_us_flow, 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)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf_us_flow, flow_id);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf_us_flow, flow_id);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "mac_learning");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf_us_flow, mac_learning);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf_us_flow, mac_learning);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "vlan_action");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf_us_flow, vlan_action);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf_us_flow, vlan_action);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "vlan_tag");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf_us_flow, vlan_tag);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf_us_flow, vlan_tag);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tpid_index");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf_us_flow, tpid_index);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf_us_flow, tpid_index);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_iwf_us_flow, flow_id) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_iwf_us_flow, mac_learning) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_iwf_us_flow, vlan_action) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_iwf_us_flow, vlan_tag) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_iwf_us_flow, tpid_index))
    {
        BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf_us_flow, all_properties);
        bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_iwf_us_flow, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_get(device_id, &cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_iwf_us_flow_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_iwf_us_flow_cfg cfg;        /**< declare main API struct */
    bcmolt_gpon_iwf_us_flow_key key = { };  /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_iwf_us_flow_cfg cfg;\n");
    bcmcli_log("bcmolt_gpon_iwf_us_flow_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_US_FLOW, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_IWF_US_FLOW_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "gem_port_id");
    if (cli_parm != NULL)
    {
        key.gem_port_id = (bcmolt_gpon_gem_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "gem_port_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.gem_port_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_US_FLOW, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_IWF_US_FLOW_KEY_ID_GEM_PORT_ID, &key.gem_port_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, gpon_iwf_us_flow, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, gpon_iwf_us_flow, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "flow_id");
    if (cli_parm != NULL)
    {
        bcmolt_flow_id val;
        val = (bcmolt_flow_id) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_us_flow, flow_id, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_us_flow, flow_id, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_US_FLOW, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_IWF_US_FLOW_CFG_ID_FLOW_ID, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "mac_learning");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_us_flow, mac_learning, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_us_flow, mac_learning, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_US_FLOW, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_IWF_US_FLOW_CFG_ID_MAC_LEARNING, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "vlan_action");
    if (cli_parm != NULL)
    {
        bcmolt_us_vlan_action val;
        val = (bcmolt_us_vlan_action) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_us_flow, vlan_action, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_us_flow, vlan_action, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_US_FLOW, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_IWF_US_FLOW_CFG_ID_VLAN_ACTION, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "vlan_tag.");
    if (cli_parm != NULL)
    {
        bcmolt_vlan_tag val = { };
        cli_parm = bcmcli_find_named_parm(session, "vlan_tag.vlan_id");
        if (cli_parm != NULL)
        {
            val.vlan_id = (bcmolt_vlan_id) cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "vlan_tag.vlan_id is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "vlan_tag.pbit");
        if (cli_parm != NULL)
        {
            val.pbit = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "vlan_tag.pbit is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_us_flow, vlan_tag, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_vlan_tag val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_US_FLOW, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_IWF_US_FLOW_CFG_ID_VLAN_TAG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_us_flow, vlan_tag, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "tpid_index");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_us_flow, tpid_index, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_us_flow, tpid_index, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_US_FLOW, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_IWF_US_FLOW_CFG_ID_TPID_INDEX, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_cfg_set(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_set(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_iwf_us_flow_cfg_clear(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_iwf_us_flow_cfg cfg;        /**< declare main API struct */
    bcmolt_gpon_iwf_us_flow_key key = { };  /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_iwf_us_flow_cfg cfg;\n");
    bcmcli_log("bcmolt_gpon_iwf_us_flow_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_clear");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_US_FLOW, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_IWF_US_FLOW_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "gem_port_id");
    if (cli_parm != NULL)
    {
        key.gem_port_id = (bcmolt_gpon_gem_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "gem_port_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.gem_port_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_US_FLOW, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_IWF_US_FLOW_KEY_ID_GEM_PORT_ID, &key.gem_port_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, gpon_iwf_us_flow, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, gpon_iwf_us_flow, key);\n");

    /* call API */
    err = bcmolt_cfg_clear(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_clear(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_iwf_us_flow_cfg_get_multi(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_iwf_us_flow_cfg cfg;        /**< declare main API struct */
    bcmolt_gpon_iwf_us_flow_key key = { };  /**< declare key */
    bcmolt_msg_set *msg_set = NULL;         /**< declare message set */
    uint32_t max_msgs;                      /**< declare max number of msgs to get */
    bcmos_bool invert_filter;               /**< declare filter invert flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_iwf_us_flow_cfg cfg;\n");
    bcmcli_log("bcmolt_gpon_iwf_us_flow_key key = {  };\n");
    bcmcli_log("bcmolt_msg_set* msg_set = NULL;\n");
    bcmcli_log("uint32_t max_msgs;\n");
    bcmcli_log("bcmos_bool invert_filter;\n");
    apicli_print_start(session, "bcmolt_cfg_get_multi");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_US_FLOW, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_IWF_US_FLOW_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "gem_port_id");
    if (cli_parm != NULL)
    {
        key.gem_port_id = (bcmolt_gpon_gem_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "gem_port_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.gem_port_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_US_FLOW, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_IWF_US_FLOW_KEY_ID_GEM_PORT_ID, &key.gem_port_id);
    bcmcli_log(";\n");

    /* set max number of msgs from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "max_msgs");
    if (cli_parm != NULL)
    {
        max_msgs = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "max_msgs is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("max_msgs = %d;\n", max_msgs);

    /* set filter invert flag from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "filter_invert");
    if (cli_parm != NULL)
    {
        invert_filter = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "filter_invert is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("invert_filter = %s;\n", (invert_filter) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* allocate message set */
    err = apicli_msg_set_alloc(byte_pool, BCMOLT_OBJ_ID_GPON_IWF_US_FLOW, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);
    if (err != BCM_ERR_OK)
    {
        return err;
    }

    bcmcli_log("bcmolt_msg_set_alloc(BCMOLT_OBJ_ID_GPON_IWF_US_FLOW, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, gpon_iwf_us_flow, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, gpon_iwf_us_flow, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "filter.flow_id");
    if (cli_parm != NULL)
    {
        bcmolt_flow_id val;
        val = (bcmolt_flow_id) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_us_flow, flow_id, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_us_flow, flow_id, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_US_FLOW, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_IWF_US_FLOW_CFG_ID_FLOW_ID, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "flow_id");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf_us_flow, flow_id);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf_us_flow, flow_id);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.mac_learning");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_us_flow, mac_learning, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_us_flow, mac_learning, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_US_FLOW, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_IWF_US_FLOW_CFG_ID_MAC_LEARNING, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "mac_learning");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf_us_flow, mac_learning);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf_us_flow, mac_learning);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.vlan_action");
    if (cli_parm != NULL)
    {
        bcmolt_us_vlan_action val;
        val = (bcmolt_us_vlan_action) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_us_flow, vlan_action, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_us_flow, vlan_action, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_US_FLOW, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_IWF_US_FLOW_CFG_ID_VLAN_ACTION, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "vlan_action");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf_us_flow, vlan_action);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf_us_flow, vlan_action);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.vlan_tag.");
    if (cli_parm != NULL)
    {
        bcmolt_vlan_tag val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.vlan_tag.vlan_id");
        if (cli_parm != NULL)
        {
            val.vlan_id = (bcmolt_vlan_id) cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.vlan_tag.vlan_id is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.vlan_tag.pbit");
        if (cli_parm != NULL)
        {
            val.pbit = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.vlan_tag.pbit is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_us_flow, vlan_tag, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_vlan_tag val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_US_FLOW, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_IWF_US_FLOW_CFG_ID_VLAN_TAG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_us_flow, vlan_tag, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "vlan_tag");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf_us_flow, vlan_tag);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf_us_flow, vlan_tag);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.tpid_index");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_us_flow, tpid_index, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_iwf_us_flow, tpid_index, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_IWF_US_FLOW, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_IWF_US_FLOW_CFG_ID_TPID_INDEX, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "tpid_index");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf_us_flow, tpid_index);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf_us_flow, tpid_index);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_iwf_us_flow, flow_id) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_iwf_us_flow, mac_learning) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_iwf_us_flow, vlan_action) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_iwf_us_flow, vlan_tag) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_iwf_us_flow, tpid_index))
    {
        BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf_us_flow, all_properties);
        bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_iwf_us_flow, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);
    bcmcli_log("bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_ni_cfg_get(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_ni_cfg cfg;         /**< declare main API struct */
    bcmolt_gpon_ni_key key = { };   /**< declare key */
    uint8_t *list_mem;              /**< declare memory buffer for variable-sized lists */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_ni_cfg cfg;\n");
    bcmcli_log("bcmolt_gpon_ni_key key = {  };\n");
    bcmcli_log("uint8_t* list_mem;\n");
    apicli_print_start(session, "bcmolt_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_NI_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, gpon_ni, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, gpon_ni, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "pon_status");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, pon_status);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, pon_status);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "available_bandwidth");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, available_bandwidth);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, available_bandwidth);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "number_of_active_onus");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, number_of_active_onus);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, number_of_active_onus);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "number_of_active_standby_onus");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, number_of_active_standby_onus);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, number_of_active_standby_onus);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "prbs_status");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, prbs_status);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, prbs_status);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "pon_distance");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, pon_distance);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, pon_distance);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "ranging_window_size");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, ranging_window_size);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, ranging_window_size);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "preassigned_equalization_delay");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, preassigned_equalization_delay);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, preassigned_equalization_delay);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "eqd_cycles_number");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, eqd_cycles_number);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, eqd_cycles_number);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "power_level");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, power_level);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, power_level);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "ds_fec_mode");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, ds_fec_mode);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, ds_fec_mode);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "drift_control");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, drift_control);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, drift_control);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "ds_ber_reporting_interval");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, ds_ber_reporting_interval);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, ds_ber_reporting_interval);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "los_alarm_threshold");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, los_alarm_threshold);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, los_alarm_threshold);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "los_initial_value");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, los_initial_value);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, los_initial_value);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_alarms_thresholds");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, onu_alarms_thresholds);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, onu_alarms_thresholds);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "ber_monitor");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, ber_monitor);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, ber_monitor);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "ploam_ack_timeout");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, ploam_ack_timeout);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, ploam_ack_timeout);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_activation");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, onu_activation);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, onu_activation);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "sn_acquisition");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, sn_acquisition);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, sn_acquisition);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "key_exchange");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, key_exchange);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, key_exchange);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "protection_switching");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, protection_switching);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, protection_switching);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "cbr_rt_allocation_profile");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, cbr_rt_allocation_profile);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, cbr_rt_allocation_profile);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "cbr_nrt_allocation_profile");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, cbr_nrt_allocation_profile);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, cbr_nrt_allocation_profile);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "dba");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, dba);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, dba);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "power_management");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, power_management);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, power_management);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rogue_onu_detection_process");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, rogue_onu_detection_process);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, rogue_onu_detection_process);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "periodic_standby_pon_monitoring");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, periodic_standby_pon_monitoring);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, periodic_standby_pon_monitoring);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "prbs_checker");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, prbs_checker);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, prbs_checker);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "prbs_generator");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, prbs_generator);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, prbs_generator);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "min_data_alloc_id");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, min_data_alloc_id);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, min_data_alloc_id);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "automatic_onu_deactivation");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, automatic_onu_deactivation);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, automatic_onu_deactivation);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "us_bandwidth_limit");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, us_bandwidth_limit);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, us_bandwidth_limit);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "all_onus");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, all_onus);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, all_onus);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "all_mcast_gem_ports");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, all_mcast_gem_ports);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, all_mcast_gem_ports);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "debug");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, debug);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, debug);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_upgrade_params");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, onu_upgrade_params);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, onu_upgrade_params);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "ps_c_wait_before_deactivation_timeout");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, ps_c_wait_before_deactivation_timeout);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, ps_c_wait_before_deactivation_timeout);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "bip32_indication_control");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, bip32_indication_control);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, bip32_indication_control);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_ni, pon_status) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_ni, available_bandwidth) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_ni, number_of_active_onus) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_ni, number_of_active_standby_onus) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_ni, prbs_status) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_ni, pon_distance) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_ni, ranging_window_size) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_ni, preassigned_equalization_delay) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_ni, eqd_cycles_number) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_ni, power_level) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_ni, ds_fec_mode) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_ni, drift_control) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_ni, ds_ber_reporting_interval) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_ni, los_alarm_threshold) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_ni, los_initial_value) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_ni, onu_alarms_thresholds) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_ni, ber_monitor) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_ni, ploam_ack_timeout) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_ni, onu_activation) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_ni, sn_acquisition) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_ni, key_exchange) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_ni, protection_switching) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_ni, cbr_rt_allocation_profile) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_ni, cbr_nrt_allocation_profile) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_ni, dba) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_ni, power_management) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_ni, rogue_onu_detection_process) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_ni, periodic_standby_pon_monitoring) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_ni, prbs_checker) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_ni, prbs_generator) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_ni, min_data_alloc_id) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_ni, automatic_onu_deactivation) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_ni, us_bandwidth_limit) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_ni, all_onus) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_ni, all_mcast_gem_ports) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_ni, debug) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_ni, onu_upgrade_params) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_ni, ps_c_wait_before_deactivation_timeout) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_ni, bip32_indication_control))
    {
        BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, all_properties);
        bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_ni, all_properties);\n");
    }

    /* set memory to use for variable-sized lists */
    list_mem = apicli_byte_pool_calloc(byte_pool, APICLI_DYNAMIC_LIST_BUFFER_SIZE);
    if (list_mem == NULL)
    {
        apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
        return BCM_ERR_NOMEM;
    }

    bcmcli_log("list_mem = bcmos_calloc(APICLI_DYNAMIC_LIST_BUFFER_SIZE);\n");
    BCMOLT_CFG_LIST_BUF_SET(&cfg, gpon_ni, list_mem, APICLI_DYNAMIC_LIST_BUFFER_SIZE);
    bcmcli_log("BCMOLT_CFG_LIST_BUF_SET(&cfg, gpon_ni, list_mem, APICLI_DYNAMIC_LIST_BUFFER_SIZE);\n");

    /* call API */
    err = bcmolt_cfg_get(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_get(device_id, &cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_ni_cfg_set(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_ni_cfg cfg;         /**< declare main API struct */
    bcmolt_gpon_ni_key key = { };   /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_ni_cfg cfg;\n");
    bcmcli_log("bcmolt_gpon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_NI_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, gpon_ni, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, gpon_ni, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_parm_by_prefix(session, "pon_distance.");
    if (cli_parm != NULL)
    {
        bcmolt_pon_distance val = { };
        cli_parm = bcmcli_find_named_parm(session, "pon_distance.max_log_distance");
        if (cli_parm != NULL)
        {
            val.max_log_distance = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "pon_distance.max_log_distance is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "pon_distance.max_diff_reach");
        if (cli_parm != NULL)
        {
            val.max_diff_reach = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "pon_distance.max_diff_reach is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, pon_distance, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_pon_distance val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_PON_DISTANCE, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, pon_distance, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "preassigned_equalization_delay");
    if (cli_parm != NULL)
    {
        uint32_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, preassigned_equalization_delay, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, preassigned_equalization_delay, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_PREASSIGNED_EQUALIZATION_DELAY, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "eqd_cycles_number");
    if (cli_parm != NULL)
    {
        uint32_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, eqd_cycles_number, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, eqd_cycles_number, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_EQD_CYCLES_NUMBER, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "power_level.");
    if (cli_parm != NULL)
    {
        bcmolt_pon_power_level val = { };
        cli_parm = bcmcli_find_named_parm(session, "power_level.pls_maximum_allocation_size");
        if (cli_parm != NULL)
        {
            val.pls_maximum_allocation_size = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "power_level.pls_maximum_allocation_size is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "power_level.mode");
        if (cli_parm != NULL)
        {
            val.mode = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "power_level.mode is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, power_level, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_pon_power_level val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_POWER_LEVEL, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, power_level, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "ds_fec_mode");
    if (cli_parm != NULL)
    {
        bcmolt_control_state val;
        val = (bcmolt_control_state) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, ds_fec_mode, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, ds_fec_mode, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_DS_FEC_MODE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "drift_control.");
    if (cli_parm != NULL)
    {
        bcmolt_pon_drift_control val = { };
        cli_parm = bcmcli_find_named_parm(session, "drift_control.drift_interval");
        if (cli_parm != NULL)
        {
            val.drift_interval = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "drift_control.drift_interval is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "drift_control.drift_limit");
        if (cli_parm != NULL)
        {
            val.drift_limit = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "drift_control.drift_limit is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "drift_control.transmission_control_limit");
        if (cli_parm != NULL)
        {
            val.transmission_control_limit = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "drift_control.transmission_control_limit is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, drift_control, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_pon_drift_control val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_DRIFT_CONTROL, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, drift_control, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "ds_ber_reporting_interval");
    if (cli_parm != NULL)
    {
        bcmolt_ber_interval val;
        val = (bcmolt_ber_interval) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, ds_ber_reporting_interval, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, ds_ber_reporting_interval, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_DS_BER_REPORTING_INTERVAL, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "los_alarm_threshold");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, los_alarm_threshold, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, los_alarm_threshold, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_LOS_ALARM_THRESHOLD, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "los_initial_value");
    if (cli_parm != NULL)
    {
        bcmolt_status val;
        val = (bcmolt_status) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, los_initial_value, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, los_initial_value, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_LOS_INITIAL_VALUE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "onu_alarms_thresholds.");
    if (cli_parm != NULL)
    {
        bcmolt_gpon_onu_alarms_thresholds val = { };
        cli_parm = bcmcli_find_named_parm(session, "onu_alarms_thresholds.losi");
        if (cli_parm != NULL)
        {
            val.losi = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "onu_alarms_thresholds.losi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "onu_alarms_thresholds.lofi");
        if (cli_parm != NULL)
        {
            val.lofi = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "onu_alarms_thresholds.lofi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "onu_alarms_thresholds.loami");
        if (cli_parm != NULL)
        {
            val.loami = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "onu_alarms_thresholds.loami is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, onu_alarms_thresholds, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_gpon_onu_alarms_thresholds val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_ONU_ALARMS_THRESHOLDS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, onu_alarms_thresholds, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "ber_monitor.");
    if (cli_parm != NULL)
    {
        bcmolt_ber_monitor_params val = { };
        cli_parm = bcmcli_find_named_parm(session, "ber_monitor.us_ber_interval");
        if (cli_parm != NULL)
        {
            val.us_ber_interval = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ber_monitor.us_ber_interval is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "ber_monitor.sf_threshold");
        if (cli_parm != NULL)
        {
            val.sf_threshold = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ber_monitor.sf_threshold is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "ber_monitor.sd_threshold");
        if (cli_parm != NULL)
        {
            val.sd_threshold = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ber_monitor.sd_threshold is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, ber_monitor, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_ber_monitor_params val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_BER_MONITOR, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, ber_monitor, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "ploam_ack_timeout");
    if (cli_parm != NULL)
    {
        uint16_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, ploam_ack_timeout, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, ploam_ack_timeout, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_PLOAM_ACK_TIMEOUT, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "onu_activation.");
    if (cli_parm != NULL)
    {
        bcmolt_gpon_onu_activation val = { };
        cli_parm = bcmcli_find_named_parm(session, "onu_activation.key_exchange");
        if (cli_parm != NULL)
        {
            val.key_exchange = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "onu_activation.key_exchange is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "onu_activation.password_authentication");
        if (cli_parm != NULL)
        {
            val.password_authentication = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "onu_activation.password_authentication is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "onu_activation.fail_due_to_password_authentication_failure");
        if (cli_parm != NULL)
        {
            val.fail_due_to_password_authentication_failure = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "onu_activation.fail_due_to_password_authentication_failure is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, onu_activation, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_gpon_onu_activation val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_ONU_ACTIVATION, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, onu_activation, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "sn_acquisition.");
    if (cli_parm != NULL)
    {
        bcmolt_gpon_sn_acquisition val = { };
        cli_parm = bcmcli_find_named_parm(session, "sn_acquisition.interval");
        if (cli_parm != NULL)
        {
            val.interval = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "sn_acquisition.interval is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "sn_acquisition.control");
        if (cli_parm != NULL)
        {
            val.control = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "sn_acquisition.control is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "sn_acquisition.onu_post_discovery_mode");
        if (cli_parm != NULL)
        {
            val.onu_post_discovery_mode = (bcmolt_onu_post_discovery_mode) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "sn_acquisition.onu_post_discovery_mode is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, sn_acquisition, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_gpon_sn_acquisition val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_SN_ACQUISITION, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, sn_acquisition, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "key_exchange.");
    if (cli_parm != NULL)
    {
        bcmolt_gpon_key_exchange val = { };
        cli_parm = bcmcli_find_named_parm(session, "key_exchange.interval");
        if (cli_parm != NULL)
        {
            val.interval = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "key_exchange.interval is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "key_exchange.control");
        if (cli_parm != NULL)
        {
            val.control = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "key_exchange.control is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "key_exchange.mode");
        if (cli_parm != NULL)
        {
            val.mode = (bcmolt_key_exchange_mode) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "key_exchange.mode is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "key_exchange.encrypted_ports_only");
        if (cli_parm != NULL)
        {
            val.encrypted_ports_only = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "key_exchange.encrypted_ports_only is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, key_exchange, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_gpon_key_exchange val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_KEY_EXCHANGE, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, key_exchange, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "protection_switching.");
    if (cli_parm != NULL)
    {
        bcmolt_pon_protection_switching val = { };
        cli_parm = bcmcli_find_named_parm(session, "protection_switching.timeout");
        if (cli_parm != NULL)
        {
            val.timeout = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "protection_switching.timeout is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "protection_switching.gpio_pin");
        if (cli_parm != NULL)
        {
            val.gpio_pin = (bcmolt_gpio_pin) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "protection_switching.gpio_pin is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "protection_switching.options");
        if (cli_parm != NULL)
        {
            val.options = (bcmolt_pon_protection_switching_options) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "protection_switching.options is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, protection_switching, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_pon_protection_switching val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_PROTECTION_SWITCHING, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, protection_switching, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "cbr_rt_allocation_profile.");
    if (cli_parm != NULL)
    {
        bcmolt_cbr_rt_allocation_profile val = { };
        cli_parm = bcmcli_find_named_parm(session, "cbr_rt_allocation_profile.ma_7");
        if (cli_parm != NULL)
        {
            val.ma_7 = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cbr_rt_allocation_profile.ma_7 is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "cbr_rt_allocation_profile.ma_3");
        if (cli_parm != NULL)
        {
            val.ma_3 = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cbr_rt_allocation_profile.ma_3 is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "cbr_rt_allocation_profile.ma_1");
        if (cli_parm != NULL)
        {
            val.ma_1 = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cbr_rt_allocation_profile.ma_1 is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, cbr_rt_allocation_profile, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_cbr_rt_allocation_profile val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_CBR_RT_ALLOCATION_PROFILE, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, cbr_rt_allocation_profile, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "cbr_nrt_allocation_profile.");
    if (cli_parm != NULL)
    {
        bcmolt_arr_u16_2 val = { };
        cli_parm = bcmcli_find_named_parm(session, "cbr_nrt_allocation_profile.arr");
        if (cli_parm != NULL)
        {
            int32_t i0;
            if (cli_parm->array_size != 2)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "array cbr_nrt_allocation_profile.arr must have 2 elements\n");
                return BCM_ERR_PARM;
            }

            for (i0 = 0; i0 < 2; i0++)
            {
                val.arr[i0] = cli_parm->values[i0].unumber;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cbr_nrt_allocation_profile.arr is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, cbr_nrt_allocation_profile, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_arr_u16_2 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_CBR_NRT_ALLOCATION_PROFILE, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, cbr_nrt_allocation_profile, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "dba.");
    if (cli_parm != NULL)
    {
        bcmolt_pon_dba val = { };
        cli_parm = bcmcli_find_named_parm(session, "dba.sr_reporting_block_size");
        if (cli_parm != NULL)
        {
            val.sr_reporting_block_size = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "dba.sr_reporting_block_size is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "dba.dba_mode");
        if (cli_parm != NULL)
        {
            val.dba_mode = (bcmolt_dba_mode) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "dba.dba_mode is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, dba, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_pon_dba val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_DBA, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, dba, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "power_management.");
    if (cli_parm != NULL)
    {
        bcmolt_onu_power_management_configuration val = { };
        cli_parm = bcmcli_find_named_parm(session, "power_management.ilowpower");
        if (cli_parm != NULL)
        {
            val.ilowpower = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "power_management.ilowpower is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "power_management.iaware");
        if (cli_parm != NULL)
        {
            val.iaware = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "power_management.iaware is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "power_management.itransinit");
        if (cli_parm != NULL)
        {
            val.itransinit = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "power_management.itransinit is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "power_management.itxinit");
        if (cli_parm != NULL)
        {
            val.itxinit = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "power_management.itxinit is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "power_management.irxoff");
        if (cli_parm != NULL)
        {
            val.irxoff = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "power_management.irxoff is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "power_management.low_power_clobi");
        if (cli_parm != NULL)
        {
            val.low_power_clobi = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "power_management.low_power_clobi is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, power_management, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_onu_power_management_configuration val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_POWER_MANAGEMENT, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, power_management, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "rogue_onu_detection_process.");
    if (cli_parm != NULL)
    {
        bcmolt_rogue_onu_detection_process val = { };
        cli_parm = bcmcli_find_named_parm(session, "rogue_onu_detection_process.control");
        if (cli_parm != NULL)
        {
            val.control = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "rogue_onu_detection_process.control is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "rogue_onu_detection_process.detection_algorithm.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "rogue_onu_detection_process.detection_algorithm.algorithm_type");
            if (cli_parm != NULL)
            {
                val.detection_algorithm.algorithm_type = (bcmolt_rogue_detection_algorithm_type) cli_parm->value.enum_val;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "rogue_onu_detection_process.detection_algorithm.algorithm_type is not set\n");
                return BCM_ERR_PARM;
            }

            switch (val.detection_algorithm.algorithm_type)
            {
                case BCMOLT_ROGUE_DETECTION_ALGORITHM_TYPE_EARLY_ROGUE_DETECTION:
                    cli_parm = bcmcli_find_named_parm(session, "rogue_onu_detection_process.detection_algorithm.measurement_type");
                    if (cli_parm != NULL)
                    {
                        val.detection_algorithm.u.early_rogue_detection.measurement_type = (bcmolt_rogue_detection_window) cli_parm->value.enum_val;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "rogue_onu_detection_process.detection_algorithm.measurement_type is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "rogue_onu_detection_process.detection_algorithm.interval");
                    if (cli_parm != NULL)
                    {
                        val.detection_algorithm.u.early_rogue_detection.interval = cli_parm->value.unumber;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "rogue_onu_detection_process.detection_algorithm.interval is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "rogue_onu_detection_process.detection_algorithm.second_ranging_window");
                    if (cli_parm != NULL)
                    {
                        val.detection_algorithm.u.early_rogue_detection.second_ranging_window = cli_parm->value.number;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "rogue_onu_detection_process.detection_algorithm.second_ranging_window is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "rogue_onu_detection_process.detection_algorithm.alloc_type_to_scan");
                    if (cli_parm != NULL)
                    {
                        val.detection_algorithm.u.early_rogue_detection.alloc_type_to_scan = (bcmolt_alloc_type_to_scan) cli_parm->value.enum_val;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "rogue_onu_detection_process.detection_algorithm.alloc_type_to_scan is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_ROGUE_DETECTION_ALGORITHM_TYPE_SPECIAL_MAP:
                    cli_parm = bcmcli_find_parm_by_prefix(session, "rogue_onu_detection_process.detection_algorithm.accesses.");
                    if (cli_parm != NULL)
                    {
                        int32_t i1;
                        val.detection_algorithm.u.special_map.accesses.val = apicli_byte_pool_calloc(byte_pool, cli_parm->array_size * sizeof(*val.detection_algorithm.u.special_map.accesses.val));
                        if (val.detection_algorithm.u.special_map.accesses.val == NULL)
                        {
                            apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
                            return BCM_ERR_NOMEM;
                        }

                        val.detection_algorithm.u.special_map.accesses.len = cli_parm->array_size;
                        cli_parm = bcmcli_find_named_parm(session, "rogue_onu_detection_process.detection_algorithm.accesses.plo_size");
                        if (cli_parm != NULL)
                        {
                            if (cli_parm->array_size != val.detection_algorithm.u.special_map.accesses.len)
                            {
                                apicli_print_complete(session, BCM_ERR_PARM, "rogue_onu_detection_process.detection_algorithm.accesses.plo_size is a different size than other arrays in the struct\n");
                                return BCM_ERR_PARM;
                            }

                            for (i1 = 0; i1 < val.detection_algorithm.u.special_map.accesses.len; i1++)
                            {
                                val.detection_algorithm.u.special_map.accesses.val[i1].plo_size = cli_parm->values[i1].unumber;
                            }
                        }

                        cli_parm = bcmcli_find_named_parm(session, "rogue_onu_detection_process.detection_algorithm.accesses.alloc_id");
                        if (cli_parm != NULL)
                        {
                            if (cli_parm->array_size != val.detection_algorithm.u.special_map.accesses.len)
                            {
                                apicli_print_complete(session, BCM_ERR_PARM, "rogue_onu_detection_process.detection_algorithm.accesses.alloc_id is a different size than other arrays in the struct\n");
                                return BCM_ERR_PARM;
                            }

                            for (i1 = 0; i1 < val.detection_algorithm.u.special_map.accesses.len; i1++)
                            {
                                val.detection_algorithm.u.special_map.accesses.val[i1].alloc_id = (bcmolt_pon_alloc_id) cli_parm->values[i1].unumber;
                            }
                        }

                        cli_parm = bcmcli_find_named_parm(session, "rogue_onu_detection_process.detection_algorithm.accesses.onu_id");
                        if (cli_parm != NULL)
                        {
                            if (cli_parm->array_size != val.detection_algorithm.u.special_map.accesses.len)
                            {
                                apicli_print_complete(session, BCM_ERR_PARM, "rogue_onu_detection_process.detection_algorithm.accesses.onu_id is a different size than other arrays in the struct\n");
                                return BCM_ERR_PARM;
                            }

                            for (i1 = 0; i1 < val.detection_algorithm.u.special_map.accesses.len; i1++)
                            {
                                val.detection_algorithm.u.special_map.accesses.val[i1].onu_id = (bcmolt_pon_onu_id) cli_parm->values[i1].unumber;
                            }
                        }

                        cli_parm = bcmcli_find_named_parm(session, "rogue_onu_detection_process.detection_algorithm.accesses.access_size");
                        if (cli_parm != NULL)
                        {
                            if (cli_parm->array_size != val.detection_algorithm.u.special_map.accesses.len)
                            {
                                apicli_print_complete(session, BCM_ERR_PARM, "rogue_onu_detection_process.detection_algorithm.accesses.access_size is a different size than other arrays in the struct\n");
                                return BCM_ERR_PARM;
                            }

                            for (i1 = 0; i1 < val.detection_algorithm.u.special_map.accesses.len; i1++)
                            {
                                val.detection_algorithm.u.special_map.accesses.val[i1].access_size = cli_parm->values[i1].unumber;
                            }
                        }
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "rogue_onu_detection_process.detection_algorithm.accesses is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_ROGUE_DETECTION_ALGORITHM_TYPE_EXTENDED_GUARD_TIME:
                    cli_parm = bcmcli_find_named_parm(session, "rogue_onu_detection_process.detection_algorithm.additional_guard_time");
                    if (cli_parm != NULL)
                    {
                        val.detection_algorithm.u.extended_guard_time.additional_guard_time = cli_parm->value.unumber;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "rogue_onu_detection_process.detection_algorithm.additional_guard_time is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                default:
                    apicli_print_complete(session, BCM_ERR_RANGE, "\n");
                    return BCM_ERR_RANGE;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "rogue_onu_detection_process.detection_algorithm is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, rogue_onu_detection_process, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_rogue_onu_detection_process val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_ROGUE_ONU_DETECTION_PROCESS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, rogue_onu_detection_process, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "periodic_standby_pon_monitoring.");
    if (cli_parm != NULL)
    {
        bcmolt_periodic_standby_pon_monitoring val = { };
        cli_parm = bcmcli_find_named_parm(session, "periodic_standby_pon_monitoring.interval");
        if (cli_parm != NULL)
        {
            val.interval = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "periodic_standby_pon_monitoring.interval is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "periodic_standby_pon_monitoring.control");
        if (cli_parm != NULL)
        {
            val.control = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "periodic_standby_pon_monitoring.control is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, periodic_standby_pon_monitoring, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_periodic_standby_pon_monitoring val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_PERIODIC_STANDBY_PON_MONITORING, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, periodic_standby_pon_monitoring, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "prbs_checker.");
    if (cli_parm != NULL)
    {
        bcmolt_prbs_checker_config val = { };
        cli_parm = bcmcli_find_named_parm(session, "prbs_checker.polynom");
        if (cli_parm != NULL)
        {
            val.polynom = (bcmolt_prbs_polynomial) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "prbs_checker.polynom is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "prbs_checker.mode");
        if (cli_parm != NULL)
        {
            val.mode = (bcmolt_prbs_checker_mode) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "prbs_checker.mode is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "prbs_checker.data_invert");
        if (cli_parm != NULL)
        {
            val.data_invert = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "prbs_checker.data_invert is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "prbs_checker.control");
        if (cli_parm != NULL)
        {
            val.control = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "prbs_checker.control is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, prbs_checker, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_prbs_checker_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_PRBS_CHECKER, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, prbs_checker, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "prbs_generator.");
    if (cli_parm != NULL)
    {
        bcmolt_prbs_generator_config val = { };
        cli_parm = bcmcli_find_named_parm(session, "prbs_generator.polynom");
        if (cli_parm != NULL)
        {
            val.polynom = (bcmolt_prbs_polynomial) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "prbs_generator.polynom is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "prbs_generator.error_insert");
        if (cli_parm != NULL)
        {
            val.error_insert = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "prbs_generator.error_insert is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "prbs_generator.invert");
        if (cli_parm != NULL)
        {
            val.invert = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "prbs_generator.invert is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "prbs_generator.control");
        if (cli_parm != NULL)
        {
            val.control = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "prbs_generator.control is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, prbs_generator, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_prbs_generator_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_PRBS_GENERATOR, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, prbs_generator, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "min_data_alloc_id");
    if (cli_parm != NULL)
    {
        bcmolt_gpon_alloc_id val;
        val = (bcmolt_gpon_alloc_id) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, min_data_alloc_id, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, min_data_alloc_id, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_MIN_DATA_ALLOC_ID, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "automatic_onu_deactivation.");
    if (cli_parm != NULL)
    {
        bcmolt_automatic_onu_deactivation val = { };
        cli_parm = bcmcli_find_named_parm(session, "automatic_onu_deactivation.los");
        if (cli_parm != NULL)
        {
            val.los = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "automatic_onu_deactivation.los is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "automatic_onu_deactivation.onu_alarms");
        if (cli_parm != NULL)
        {
            val.onu_alarms = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "automatic_onu_deactivation.onu_alarms is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "automatic_onu_deactivation.tiwi");
        if (cli_parm != NULL)
        {
            val.tiwi = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "automatic_onu_deactivation.tiwi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "automatic_onu_deactivation.ack_timeout");
        if (cli_parm != NULL)
        {
            val.ack_timeout = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "automatic_onu_deactivation.ack_timeout is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "automatic_onu_deactivation.sfi");
        if (cli_parm != NULL)
        {
            val.sfi = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "automatic_onu_deactivation.sfi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "automatic_onu_deactivation.loki");
        if (cli_parm != NULL)
        {
            val.loki = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "automatic_onu_deactivation.loki is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, automatic_onu_deactivation, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_automatic_onu_deactivation val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_AUTOMATIC_ONU_DEACTIVATION, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, automatic_onu_deactivation, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "us_bandwidth_limit");
    if (cli_parm != NULL)
    {
        uint32_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, us_bandwidth_limit, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, us_bandwidth_limit, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_US_BANDWIDTH_LIMIT, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "debug.");
    if (cli_parm != NULL)
    {
        bcmolt_gpon_ni_debug val = { };
        cli_parm = bcmcli_find_named_parm(session, "debug.number_of_gem_ports_per_onu");
        if (cli_parm != NULL)
        {
            val.number_of_gem_ports_per_onu = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "debug.number_of_gem_ports_per_onu is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, debug, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_gpon_ni_debug val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_DEBUG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, debug, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "onu_upgrade_params.");
    if (cli_parm != NULL)
    {
        bcmolt_gpon_onu_upgrade_params val = { };
        cli_parm = bcmcli_find_named_parm(session, "onu_upgrade_params.response_timeout_ms");
        if (cli_parm != NULL)
        {
            val.response_timeout_ms = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "onu_upgrade_params.response_timeout_ms is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "onu_upgrade_params.max_retry_count");
        if (cli_parm != NULL)
        {
            val.max_retry_count = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "onu_upgrade_params.max_retry_count is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "onu_upgrade_params.omci_format");
        if (cli_parm != NULL)
        {
            val.omci_format = (bcmolt_omci_device_id) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "onu_upgrade_params.omci_format is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "onu_upgrade_params.window_size");
        if (cli_parm != NULL)
        {
            val.window_size = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "onu_upgrade_params.window_size is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "onu_upgrade_params.activate_commit");
        if (cli_parm != NULL)
        {
            val.activate_commit = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "onu_upgrade_params.activate_commit is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "onu_upgrade_params.delay_for_commit_ms");
        if (cli_parm != NULL)
        {
            val.delay_for_commit_ms = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "onu_upgrade_params.delay_for_commit_ms is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "onu_upgrade_params.max_activation_attempts");
        if (cli_parm != NULL)
        {
            val.max_activation_attempts = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "onu_upgrade_params.max_activation_attempts is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, onu_upgrade_params, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_gpon_onu_upgrade_params val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_ONU_UPGRADE_PARAMS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, onu_upgrade_params, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "ps_c_wait_before_deactivation_timeout");
    if (cli_parm != NULL)
    {
        uint16_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, ps_c_wait_before_deactivation_timeout, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, ps_c_wait_before_deactivation_timeout, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_PS_C_WAIT_BEFORE_DEACTIVATION_TIMEOUT, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "bip32_indication_control");
    if (cli_parm != NULL)
    {
        bcmolt_control_state val;
        val = (bcmolt_control_state) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, bip32_indication_control, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, bip32_indication_control, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_BIP32_INDICATION_CONTROL, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_cfg_set(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_set(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_ni_cfg_clear(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_ni_cfg cfg;         /**< declare main API struct */
    bcmolt_gpon_ni_key key = { };   /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_ni_cfg cfg;\n");
    bcmcli_log("bcmolt_gpon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_clear");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_NI_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, gpon_ni, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, gpon_ni, key);\n");

    /* call API */
    err = bcmolt_cfg_clear(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_clear(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_ni_cfg_get_multi(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_ni_cfg cfg;         /**< declare main API struct */
    bcmolt_gpon_ni_key key = { };   /**< declare key */
    bcmolt_msg_set *msg_set = NULL; /**< declare message set */
    uint32_t max_msgs;              /**< declare max number of msgs to get */
    bcmos_bool invert_filter;       /**< declare filter invert flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_ni_cfg cfg;\n");
    bcmcli_log("bcmolt_gpon_ni_key key = {  };\n");
    bcmcli_log("bcmolt_msg_set* msg_set = NULL;\n");
    bcmcli_log("uint32_t max_msgs;\n");
    bcmcli_log("bcmos_bool invert_filter;\n");
    apicli_print_start(session, "bcmolt_cfg_get_multi");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_NI_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* set max number of msgs from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "max_msgs");
    if (cli_parm != NULL)
    {
        max_msgs = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "max_msgs is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("max_msgs = %d;\n", max_msgs);

    /* set filter invert flag from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "filter_invert");
    if (cli_parm != NULL)
    {
        invert_filter = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "filter_invert is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("invert_filter = %s;\n", (invert_filter) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* allocate message set */
    err = apicli_msg_set_alloc(byte_pool, BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);
    if (err != BCM_ERR_OK)
    {
        return err;
    }

    bcmcli_log("bcmolt_msg_set_alloc(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, gpon_ni, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, gpon_ni, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.pon_status.");
    if (cli_parm != NULL)
    {
        bcmolt_pon_status val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.pon_status.state");
        if (cli_parm != NULL)
        {
            val.state = (bcmolt_pon_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.pon_status.state is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.pon_status.los_status");
        if (cli_parm != NULL)
        {
            val.los_status = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.pon_status.los_status is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, pon_status, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_pon_status val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_PON_STATUS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, pon_status, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "pon_status");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, pon_status);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, pon_status);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.available_bandwidth.");
    if (cli_parm != NULL)
    {
        bcmolt_pon_available_bandwidth val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.available_bandwidth.cbr_bw");
        if (cli_parm != NULL)
        {
            val.cbr_bw = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.available_bandwidth.cbr_bw is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.available_bandwidth.total_bw");
        if (cli_parm != NULL)
        {
            val.total_bw = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.available_bandwidth.total_bw is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.available_bandwidth.next_onu_total_bw");
        if (cli_parm != NULL)
        {
            val.next_onu_total_bw = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.available_bandwidth.next_onu_total_bw is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, available_bandwidth, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_pon_available_bandwidth val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_AVAILABLE_BANDWIDTH, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, available_bandwidth, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "available_bandwidth");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, available_bandwidth);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, available_bandwidth);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.number_of_active_onus");
    if (cli_parm != NULL)
    {
        uint16_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, number_of_active_onus, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, number_of_active_onus, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_NUMBER_OF_ACTIVE_ONUS, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "number_of_active_onus");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, number_of_active_onus);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, number_of_active_onus);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.number_of_active_standby_onus");
    if (cli_parm != NULL)
    {
        uint16_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, number_of_active_standby_onus, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, number_of_active_standby_onus, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_NUMBER_OF_ACTIVE_STANDBY_ONUS, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "number_of_active_standby_onus");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, number_of_active_standby_onus);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, number_of_active_standby_onus);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.prbs_status.");
    if (cli_parm != NULL)
    {
        bcmolt_prbs_status val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_status.lock_state");
        if (cli_parm != NULL)
        {
            val.lock_state = (bcmolt_prbs_lock_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_status.lock_state is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_status.error_counts");
        if (cli_parm != NULL)
        {
            val.error_counts = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_status.error_counts is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, prbs_status, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_prbs_status val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_PRBS_STATUS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, prbs_status, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "prbs_status");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, prbs_status);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, prbs_status);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.pon_distance.");
    if (cli_parm != NULL)
    {
        bcmolt_pon_distance val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.pon_distance.max_log_distance");
        if (cli_parm != NULL)
        {
            val.max_log_distance = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.pon_distance.max_log_distance is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.pon_distance.max_diff_reach");
        if (cli_parm != NULL)
        {
            val.max_diff_reach = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.pon_distance.max_diff_reach is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, pon_distance, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_pon_distance val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_PON_DISTANCE, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, pon_distance, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "pon_distance");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, pon_distance);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, pon_distance);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.ranging_window_size");
    if (cli_parm != NULL)
    {
        uint32_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, ranging_window_size, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, ranging_window_size, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_RANGING_WINDOW_SIZE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "ranging_window_size");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, ranging_window_size);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, ranging_window_size);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.preassigned_equalization_delay");
    if (cli_parm != NULL)
    {
        uint32_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, preassigned_equalization_delay, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, preassigned_equalization_delay, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_PREASSIGNED_EQUALIZATION_DELAY, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "preassigned_equalization_delay");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, preassigned_equalization_delay);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, preassigned_equalization_delay);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.eqd_cycles_number");
    if (cli_parm != NULL)
    {
        uint32_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, eqd_cycles_number, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, eqd_cycles_number, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_EQD_CYCLES_NUMBER, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "eqd_cycles_number");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, eqd_cycles_number);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, eqd_cycles_number);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.power_level.");
    if (cli_parm != NULL)
    {
        bcmolt_pon_power_level val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.power_level.pls_maximum_allocation_size");
        if (cli_parm != NULL)
        {
            val.pls_maximum_allocation_size = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.power_level.pls_maximum_allocation_size is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.power_level.mode");
        if (cli_parm != NULL)
        {
            val.mode = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.power_level.mode is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, power_level, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_pon_power_level val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_POWER_LEVEL, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, power_level, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "power_level");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, power_level);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, power_level);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.ds_fec_mode");
    if (cli_parm != NULL)
    {
        bcmolt_control_state val;
        val = (bcmolt_control_state) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, ds_fec_mode, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, ds_fec_mode, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_DS_FEC_MODE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "ds_fec_mode");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, ds_fec_mode);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, ds_fec_mode);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.drift_control.");
    if (cli_parm != NULL)
    {
        bcmolt_pon_drift_control val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.drift_control.drift_interval");
        if (cli_parm != NULL)
        {
            val.drift_interval = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.drift_control.drift_interval is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.drift_control.drift_limit");
        if (cli_parm != NULL)
        {
            val.drift_limit = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.drift_control.drift_limit is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.drift_control.transmission_control_limit");
        if (cli_parm != NULL)
        {
            val.transmission_control_limit = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.drift_control.transmission_control_limit is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, drift_control, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_pon_drift_control val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_DRIFT_CONTROL, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, drift_control, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "drift_control");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, drift_control);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, drift_control);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.ds_ber_reporting_interval");
    if (cli_parm != NULL)
    {
        bcmolt_ber_interval val;
        val = (bcmolt_ber_interval) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, ds_ber_reporting_interval, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, ds_ber_reporting_interval, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_DS_BER_REPORTING_INTERVAL, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "ds_ber_reporting_interval");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, ds_ber_reporting_interval);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, ds_ber_reporting_interval);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.los_alarm_threshold");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, los_alarm_threshold, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, los_alarm_threshold, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_LOS_ALARM_THRESHOLD, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "los_alarm_threshold");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, los_alarm_threshold);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, los_alarm_threshold);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.los_initial_value");
    if (cli_parm != NULL)
    {
        bcmolt_status val;
        val = (bcmolt_status) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, los_initial_value, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, los_initial_value, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_LOS_INITIAL_VALUE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "los_initial_value");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, los_initial_value);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, los_initial_value);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.onu_alarms_thresholds.");
    if (cli_parm != NULL)
    {
        bcmolt_gpon_onu_alarms_thresholds val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.onu_alarms_thresholds.losi");
        if (cli_parm != NULL)
        {
            val.losi = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.onu_alarms_thresholds.losi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.onu_alarms_thresholds.lofi");
        if (cli_parm != NULL)
        {
            val.lofi = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.onu_alarms_thresholds.lofi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.onu_alarms_thresholds.loami");
        if (cli_parm != NULL)
        {
            val.loami = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.onu_alarms_thresholds.loami is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, onu_alarms_thresholds, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_gpon_onu_alarms_thresholds val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_ONU_ALARMS_THRESHOLDS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, onu_alarms_thresholds, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_alarms_thresholds");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, onu_alarms_thresholds);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, onu_alarms_thresholds);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.ber_monitor.");
    if (cli_parm != NULL)
    {
        bcmolt_ber_monitor_params val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.ber_monitor.us_ber_interval");
        if (cli_parm != NULL)
        {
            val.us_ber_interval = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ber_monitor.us_ber_interval is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.ber_monitor.sf_threshold");
        if (cli_parm != NULL)
        {
            val.sf_threshold = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ber_monitor.sf_threshold is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.ber_monitor.sd_threshold");
        if (cli_parm != NULL)
        {
            val.sd_threshold = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ber_monitor.sd_threshold is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, ber_monitor, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_ber_monitor_params val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_BER_MONITOR, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, ber_monitor, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "ber_monitor");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, ber_monitor);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, ber_monitor);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.ploam_ack_timeout");
    if (cli_parm != NULL)
    {
        uint16_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, ploam_ack_timeout, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, ploam_ack_timeout, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_PLOAM_ACK_TIMEOUT, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "ploam_ack_timeout");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, ploam_ack_timeout);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, ploam_ack_timeout);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.onu_activation.");
    if (cli_parm != NULL)
    {
        bcmolt_gpon_onu_activation val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.onu_activation.key_exchange");
        if (cli_parm != NULL)
        {
            val.key_exchange = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.onu_activation.key_exchange is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.onu_activation.password_authentication");
        if (cli_parm != NULL)
        {
            val.password_authentication = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.onu_activation.password_authentication is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.onu_activation.fail_due_to_password_authentication_failure");
        if (cli_parm != NULL)
        {
            val.fail_due_to_password_authentication_failure = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.onu_activation.fail_due_to_password_authentication_failure is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, onu_activation, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_gpon_onu_activation val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_ONU_ACTIVATION, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, onu_activation, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_activation");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, onu_activation);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, onu_activation);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.sn_acquisition.");
    if (cli_parm != NULL)
    {
        bcmolt_gpon_sn_acquisition val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.sn_acquisition.interval");
        if (cli_parm != NULL)
        {
            val.interval = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.sn_acquisition.interval is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.sn_acquisition.control");
        if (cli_parm != NULL)
        {
            val.control = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.sn_acquisition.control is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.sn_acquisition.onu_post_discovery_mode");
        if (cli_parm != NULL)
        {
            val.onu_post_discovery_mode = (bcmolt_onu_post_discovery_mode) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.sn_acquisition.onu_post_discovery_mode is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, sn_acquisition, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_gpon_sn_acquisition val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_SN_ACQUISITION, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, sn_acquisition, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "sn_acquisition");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, sn_acquisition);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, sn_acquisition);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.key_exchange.");
    if (cli_parm != NULL)
    {
        bcmolt_gpon_key_exchange val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.key_exchange.interval");
        if (cli_parm != NULL)
        {
            val.interval = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.key_exchange.interval is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.key_exchange.control");
        if (cli_parm != NULL)
        {
            val.control = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.key_exchange.control is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.key_exchange.mode");
        if (cli_parm != NULL)
        {
            val.mode = (bcmolt_key_exchange_mode) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.key_exchange.mode is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.key_exchange.encrypted_ports_only");
        if (cli_parm != NULL)
        {
            val.encrypted_ports_only = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.key_exchange.encrypted_ports_only is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, key_exchange, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_gpon_key_exchange val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_KEY_EXCHANGE, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, key_exchange, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "key_exchange");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, key_exchange);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, key_exchange);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.protection_switching.");
    if (cli_parm != NULL)
    {
        bcmolt_pon_protection_switching val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.protection_switching.timeout");
        if (cli_parm != NULL)
        {
            val.timeout = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.protection_switching.timeout is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.protection_switching.gpio_pin");
        if (cli_parm != NULL)
        {
            val.gpio_pin = (bcmolt_gpio_pin) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.protection_switching.gpio_pin is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.protection_switching.options");
        if (cli_parm != NULL)
        {
            val.options = (bcmolt_pon_protection_switching_options) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.protection_switching.options is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, protection_switching, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_pon_protection_switching val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_PROTECTION_SWITCHING, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, protection_switching, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "protection_switching");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, protection_switching);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, protection_switching);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.cbr_rt_allocation_profile.");
    if (cli_parm != NULL)
    {
        bcmolt_cbr_rt_allocation_profile val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.cbr_rt_allocation_profile.ma_7");
        if (cli_parm != NULL)
        {
            val.ma_7 = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.cbr_rt_allocation_profile.ma_7 is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.cbr_rt_allocation_profile.ma_3");
        if (cli_parm != NULL)
        {
            val.ma_3 = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.cbr_rt_allocation_profile.ma_3 is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.cbr_rt_allocation_profile.ma_1");
        if (cli_parm != NULL)
        {
            val.ma_1 = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.cbr_rt_allocation_profile.ma_1 is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, cbr_rt_allocation_profile, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_cbr_rt_allocation_profile val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_CBR_RT_ALLOCATION_PROFILE, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, cbr_rt_allocation_profile, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "cbr_rt_allocation_profile");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, cbr_rt_allocation_profile);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, cbr_rt_allocation_profile);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.cbr_nrt_allocation_profile.");
    if (cli_parm != NULL)
    {
        bcmolt_arr_u16_2 val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.cbr_nrt_allocation_profile.arr");
        if (cli_parm != NULL)
        {
            int32_t i0;
            if (cli_parm->array_size != 2)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "array filter.cbr_nrt_allocation_profile.arr must have 2 elements\n");
                return BCM_ERR_PARM;
            }

            for (i0 = 0; i0 < 2; i0++)
            {
                val.arr[i0] = cli_parm->values[i0].unumber;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.cbr_nrt_allocation_profile.arr is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, cbr_nrt_allocation_profile, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_arr_u16_2 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_CBR_NRT_ALLOCATION_PROFILE, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, cbr_nrt_allocation_profile, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "cbr_nrt_allocation_profile");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, cbr_nrt_allocation_profile);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, cbr_nrt_allocation_profile);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.dba.");
    if (cli_parm != NULL)
    {
        bcmolt_pon_dba val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.dba.sr_reporting_block_size");
        if (cli_parm != NULL)
        {
            val.sr_reporting_block_size = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.dba.sr_reporting_block_size is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.dba.dba_mode");
        if (cli_parm != NULL)
        {
            val.dba_mode = (bcmolt_dba_mode) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.dba.dba_mode is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, dba, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_pon_dba val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_DBA, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, dba, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "dba");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, dba);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, dba);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.power_management.");
    if (cli_parm != NULL)
    {
        bcmolt_onu_power_management_configuration val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.power_management.ilowpower");
        if (cli_parm != NULL)
        {
            val.ilowpower = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.power_management.ilowpower is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.power_management.iaware");
        if (cli_parm != NULL)
        {
            val.iaware = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.power_management.iaware is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.power_management.itransinit");
        if (cli_parm != NULL)
        {
            val.itransinit = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.power_management.itransinit is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.power_management.itxinit");
        if (cli_parm != NULL)
        {
            val.itxinit = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.power_management.itxinit is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.power_management.irxoff");
        if (cli_parm != NULL)
        {
            val.irxoff = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.power_management.irxoff is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.power_management.low_power_clobi");
        if (cli_parm != NULL)
        {
            val.low_power_clobi = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.power_management.low_power_clobi is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, power_management, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_onu_power_management_configuration val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_POWER_MANAGEMENT, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, power_management, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "power_management");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, power_management);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, power_management);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.rogue_onu_detection_process.");
    if (cli_parm != NULL)
    {
        bcmolt_rogue_onu_detection_process val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.rogue_onu_detection_process.control");
        if (cli_parm != NULL)
        {
            val.control = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.rogue_onu_detection_process.control is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "filter.rogue_onu_detection_process.detection_algorithm.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "filter.rogue_onu_detection_process.detection_algorithm.algorithm_type");
            if (cli_parm != NULL)
            {
                val.detection_algorithm.algorithm_type = (bcmolt_rogue_detection_algorithm_type) cli_parm->value.enum_val;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.rogue_onu_detection_process.detection_algorithm.algorithm_type is not set\n");
                return BCM_ERR_PARM;
            }

            switch (val.detection_algorithm.algorithm_type)
            {
                case BCMOLT_ROGUE_DETECTION_ALGORITHM_TYPE_EARLY_ROGUE_DETECTION:
                    cli_parm = bcmcli_find_named_parm(session, "filter.rogue_onu_detection_process.detection_algorithm.measurement_type");
                    if (cli_parm != NULL)
                    {
                        val.detection_algorithm.u.early_rogue_detection.measurement_type = (bcmolt_rogue_detection_window) cli_parm->value.enum_val;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "filter.rogue_onu_detection_process.detection_algorithm.measurement_type is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "filter.rogue_onu_detection_process.detection_algorithm.interval");
                    if (cli_parm != NULL)
                    {
                        val.detection_algorithm.u.early_rogue_detection.interval = cli_parm->value.unumber;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "filter.rogue_onu_detection_process.detection_algorithm.interval is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "filter.rogue_onu_detection_process.detection_algorithm.second_ranging_window");
                    if (cli_parm != NULL)
                    {
                        val.detection_algorithm.u.early_rogue_detection.second_ranging_window = cli_parm->value.number;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "filter.rogue_onu_detection_process.detection_algorithm.second_ranging_window is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "filter.rogue_onu_detection_process.detection_algorithm.alloc_type_to_scan");
                    if (cli_parm != NULL)
                    {
                        val.detection_algorithm.u.early_rogue_detection.alloc_type_to_scan = (bcmolt_alloc_type_to_scan) cli_parm->value.enum_val;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "filter.rogue_onu_detection_process.detection_algorithm.alloc_type_to_scan is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_ROGUE_DETECTION_ALGORITHM_TYPE_SPECIAL_MAP:
                    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.rogue_onu_detection_process.detection_algorithm.accesses.");
                    if (cli_parm != NULL)
                    {
                        int32_t i1;
                        val.detection_algorithm.u.special_map.accesses.val = apicli_byte_pool_calloc(byte_pool, cli_parm->array_size * sizeof(*val.detection_algorithm.u.special_map.accesses.val));
                        if (val.detection_algorithm.u.special_map.accesses.val == NULL)
                        {
                            apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
                            return BCM_ERR_NOMEM;
                        }

                        val.detection_algorithm.u.special_map.accesses.len = cli_parm->array_size;
                        cli_parm = bcmcli_find_named_parm(session, "filter.rogue_onu_detection_process.detection_algorithm.accesses.plo_size");
                        if (cli_parm != NULL)
                        {
                            if (cli_parm->array_size != val.detection_algorithm.u.special_map.accesses.len)
                            {
                                apicli_print_complete(session, BCM_ERR_PARM, "filter.rogue_onu_detection_process.detection_algorithm.accesses.plo_size is a different size than other arrays in the struct\n");
                                return BCM_ERR_PARM;
                            }

                            for (i1 = 0; i1 < val.detection_algorithm.u.special_map.accesses.len; i1++)
                            {
                                val.detection_algorithm.u.special_map.accesses.val[i1].plo_size = cli_parm->values[i1].unumber;
                            }
                        }

                        cli_parm = bcmcli_find_named_parm(session, "filter.rogue_onu_detection_process.detection_algorithm.accesses.alloc_id");
                        if (cli_parm != NULL)
                        {
                            if (cli_parm->array_size != val.detection_algorithm.u.special_map.accesses.len)
                            {
                                apicli_print_complete(session, BCM_ERR_PARM, "filter.rogue_onu_detection_process.detection_algorithm.accesses.alloc_id is a different size than other arrays in the struct\n");
                                return BCM_ERR_PARM;
                            }

                            for (i1 = 0; i1 < val.detection_algorithm.u.special_map.accesses.len; i1++)
                            {
                                val.detection_algorithm.u.special_map.accesses.val[i1].alloc_id = (bcmolt_pon_alloc_id) cli_parm->values[i1].unumber;
                            }
                        }

                        cli_parm = bcmcli_find_named_parm(session, "filter.rogue_onu_detection_process.detection_algorithm.accesses.onu_id");
                        if (cli_parm != NULL)
                        {
                            if (cli_parm->array_size != val.detection_algorithm.u.special_map.accesses.len)
                            {
                                apicli_print_complete(session, BCM_ERR_PARM, "filter.rogue_onu_detection_process.detection_algorithm.accesses.onu_id is a different size than other arrays in the struct\n");
                                return BCM_ERR_PARM;
                            }

                            for (i1 = 0; i1 < val.detection_algorithm.u.special_map.accesses.len; i1++)
                            {
                                val.detection_algorithm.u.special_map.accesses.val[i1].onu_id = (bcmolt_pon_onu_id) cli_parm->values[i1].unumber;
                            }
                        }

                        cli_parm = bcmcli_find_named_parm(session, "filter.rogue_onu_detection_process.detection_algorithm.accesses.access_size");
                        if (cli_parm != NULL)
                        {
                            if (cli_parm->array_size != val.detection_algorithm.u.special_map.accesses.len)
                            {
                                apicli_print_complete(session, BCM_ERR_PARM, "filter.rogue_onu_detection_process.detection_algorithm.accesses.access_size is a different size than other arrays in the struct\n");
                                return BCM_ERR_PARM;
                            }

                            for (i1 = 0; i1 < val.detection_algorithm.u.special_map.accesses.len; i1++)
                            {
                                val.detection_algorithm.u.special_map.accesses.val[i1].access_size = cli_parm->values[i1].unumber;
                            }
                        }
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "filter.rogue_onu_detection_process.detection_algorithm.accesses is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_ROGUE_DETECTION_ALGORITHM_TYPE_EXTENDED_GUARD_TIME:
                    cli_parm = bcmcli_find_named_parm(session, "filter.rogue_onu_detection_process.detection_algorithm.additional_guard_time");
                    if (cli_parm != NULL)
                    {
                        val.detection_algorithm.u.extended_guard_time.additional_guard_time = cli_parm->value.unumber;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "filter.rogue_onu_detection_process.detection_algorithm.additional_guard_time is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                default:
                    apicli_print_complete(session, BCM_ERR_RANGE, "\n");
                    return BCM_ERR_RANGE;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.rogue_onu_detection_process.detection_algorithm is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, rogue_onu_detection_process, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_rogue_onu_detection_process val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_ROGUE_ONU_DETECTION_PROCESS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, rogue_onu_detection_process, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rogue_onu_detection_process");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, rogue_onu_detection_process);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, rogue_onu_detection_process);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.periodic_standby_pon_monitoring.");
    if (cli_parm != NULL)
    {
        bcmolt_periodic_standby_pon_monitoring val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.periodic_standby_pon_monitoring.interval");
        if (cli_parm != NULL)
        {
            val.interval = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.periodic_standby_pon_monitoring.interval is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.periodic_standby_pon_monitoring.control");
        if (cli_parm != NULL)
        {
            val.control = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.periodic_standby_pon_monitoring.control is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, periodic_standby_pon_monitoring, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_periodic_standby_pon_monitoring val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_PERIODIC_STANDBY_PON_MONITORING, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, periodic_standby_pon_monitoring, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "periodic_standby_pon_monitoring");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, periodic_standby_pon_monitoring);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, periodic_standby_pon_monitoring);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.prbs_checker.");
    if (cli_parm != NULL)
    {
        bcmolt_prbs_checker_config val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_checker.polynom");
        if (cli_parm != NULL)
        {
            val.polynom = (bcmolt_prbs_polynomial) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_checker.polynom is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_checker.mode");
        if (cli_parm != NULL)
        {
            val.mode = (bcmolt_prbs_checker_mode) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_checker.mode is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_checker.data_invert");
        if (cli_parm != NULL)
        {
            val.data_invert = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_checker.data_invert is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_checker.control");
        if (cli_parm != NULL)
        {
            val.control = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_checker.control is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, prbs_checker, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_prbs_checker_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_PRBS_CHECKER, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, prbs_checker, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "prbs_checker");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, prbs_checker);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, prbs_checker);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.prbs_generator.");
    if (cli_parm != NULL)
    {
        bcmolt_prbs_generator_config val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_generator.polynom");
        if (cli_parm != NULL)
        {
            val.polynom = (bcmolt_prbs_polynomial) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_generator.polynom is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_generator.error_insert");
        if (cli_parm != NULL)
        {
            val.error_insert = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_generator.error_insert is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_generator.invert");
        if (cli_parm != NULL)
        {
            val.invert = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_generator.invert is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_generator.control");
        if (cli_parm != NULL)
        {
            val.control = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_generator.control is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, prbs_generator, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_prbs_generator_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_PRBS_GENERATOR, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, prbs_generator, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "prbs_generator");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, prbs_generator);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, prbs_generator);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.min_data_alloc_id");
    if (cli_parm != NULL)
    {
        bcmolt_gpon_alloc_id val;
        val = (bcmolt_gpon_alloc_id) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, min_data_alloc_id, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, min_data_alloc_id, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_MIN_DATA_ALLOC_ID, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "min_data_alloc_id");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, min_data_alloc_id);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, min_data_alloc_id);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.automatic_onu_deactivation.");
    if (cli_parm != NULL)
    {
        bcmolt_automatic_onu_deactivation val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.automatic_onu_deactivation.los");
        if (cli_parm != NULL)
        {
            val.los = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.automatic_onu_deactivation.los is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.automatic_onu_deactivation.onu_alarms");
        if (cli_parm != NULL)
        {
            val.onu_alarms = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.automatic_onu_deactivation.onu_alarms is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.automatic_onu_deactivation.tiwi");
        if (cli_parm != NULL)
        {
            val.tiwi = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.automatic_onu_deactivation.tiwi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.automatic_onu_deactivation.ack_timeout");
        if (cli_parm != NULL)
        {
            val.ack_timeout = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.automatic_onu_deactivation.ack_timeout is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.automatic_onu_deactivation.sfi");
        if (cli_parm != NULL)
        {
            val.sfi = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.automatic_onu_deactivation.sfi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.automatic_onu_deactivation.loki");
        if (cli_parm != NULL)
        {
            val.loki = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.automatic_onu_deactivation.loki is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, automatic_onu_deactivation, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_automatic_onu_deactivation val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_AUTOMATIC_ONU_DEACTIVATION, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, automatic_onu_deactivation, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "automatic_onu_deactivation");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, automatic_onu_deactivation);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, automatic_onu_deactivation);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.us_bandwidth_limit");
    if (cli_parm != NULL)
    {
        uint32_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, us_bandwidth_limit, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, us_bandwidth_limit, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_US_BANDWIDTH_LIMIT, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "us_bandwidth_limit");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, us_bandwidth_limit);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, us_bandwidth_limit);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.all_onus.");
    if (cli_parm != NULL)
    {
        bcmolt_gpon_onu_with_state_list_u16_max_128 val = { };
        int32_t i2;
        val.val = apicli_byte_pool_calloc(byte_pool, cli_parm->array_size * sizeof(*val.val));
        if (val.val == NULL)
        {
            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, "filter.all_onus.onu_id");
        if (cli_parm != NULL)
        {
            if (cli_parm->array_size != val.len)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.all_onus.onu_id is a different size than other arrays in the struct\n");
                return BCM_ERR_PARM;
            }

            for (i2 = 0; i2 < val.len; i2++)
            {
                val.val[i2].onu_id = (bcmolt_gpon_onu_id) cli_parm->values[i2].unumber;
            }
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.all_onus.state");
        if (cli_parm != NULL)
        {
            if (cli_parm->array_size != val.len)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.all_onus.state is a different size than other arrays in the struct\n");
                return BCM_ERR_PARM;
            }

            for (i2 = 0; i2 < val.len; i2++)
            {
                val.val[i2].state = (bcmolt_onu_state) cli_parm->values[i2].enum_val;
            }
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, all_onus, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_gpon_onu_with_state_list_u16_max_128 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_ALL_ONUS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, all_onus, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "all_onus");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, all_onus);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, all_onus);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.all_mcast_gem_ports.");
    if (cli_parm != NULL)
    {
        bcmolt_gpon_gem_port_with_state_list_u16_max_128 val = { };
        int32_t i3;
        val.val = apicli_byte_pool_calloc(byte_pool, cli_parm->array_size * sizeof(*val.val));
        if (val.val == NULL)
        {
            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, "filter.all_mcast_gem_ports.gem_id");
        if (cli_parm != NULL)
        {
            if (cli_parm->array_size != val.len)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.all_mcast_gem_ports.gem_id is a different size than other arrays in the struct\n");
                return BCM_ERR_PARM;
            }

            for (i3 = 0; i3 < val.len; i3++)
            {
                val.val[i3].gem_id = (bcmolt_gpon_gem_id) cli_parm->values[i3].unumber;
            }
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.all_mcast_gem_ports.state");
        if (cli_parm != NULL)
        {
            if (cli_parm->array_size != val.len)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.all_mcast_gem_ports.state is a different size than other arrays in the struct\n");
                return BCM_ERR_PARM;
            }

            for (i3 = 0; i3 < val.len; i3++)
            {
                val.val[i3].state = (bcmolt_gpon_gem_port_state) cli_parm->values[i3].enum_val;
            }
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, all_mcast_gem_ports, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_gpon_gem_port_with_state_list_u16_max_128 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_ALL_MCAST_GEM_PORTS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, all_mcast_gem_ports, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "all_mcast_gem_ports");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, all_mcast_gem_ports);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, all_mcast_gem_ports);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.debug.");
    if (cli_parm != NULL)
    {
        bcmolt_gpon_ni_debug val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.debug.number_of_gem_ports_per_onu");
        if (cli_parm != NULL)
        {
            val.number_of_gem_ports_per_onu = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.debug.number_of_gem_ports_per_onu is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, debug, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_gpon_ni_debug val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_DEBUG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, debug, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "debug");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, debug);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, debug);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.onu_upgrade_params.");
    if (cli_parm != NULL)
    {
        bcmolt_gpon_onu_upgrade_params val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.onu_upgrade_params.response_timeout_ms");
        if (cli_parm != NULL)
        {
            val.response_timeout_ms = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.onu_upgrade_params.response_timeout_ms is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.onu_upgrade_params.max_retry_count");
        if (cli_parm != NULL)
        {
            val.max_retry_count = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.onu_upgrade_params.max_retry_count is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.onu_upgrade_params.omci_format");
        if (cli_parm != NULL)
        {
            val.omci_format = (bcmolt_omci_device_id) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.onu_upgrade_params.omci_format is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.onu_upgrade_params.window_size");
        if (cli_parm != NULL)
        {
            val.window_size = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.onu_upgrade_params.window_size is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.onu_upgrade_params.activate_commit");
        if (cli_parm != NULL)
        {
            val.activate_commit = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.onu_upgrade_params.activate_commit is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.onu_upgrade_params.delay_for_commit_ms");
        if (cli_parm != NULL)
        {
            val.delay_for_commit_ms = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.onu_upgrade_params.delay_for_commit_ms is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.onu_upgrade_params.max_activation_attempts");
        if (cli_parm != NULL)
        {
            val.max_activation_attempts = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.onu_upgrade_params.max_activation_attempts is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, onu_upgrade_params, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_gpon_onu_upgrade_params val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_ONU_UPGRADE_PARAMS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, onu_upgrade_params, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_upgrade_params");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, onu_upgrade_params);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, onu_upgrade_params);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.ps_c_wait_before_deactivation_timeout");
    if (cli_parm != NULL)
    {
        uint16_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, ps_c_wait_before_deactivation_timeout, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, ps_c_wait_before_deactivation_timeout, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_PS_C_WAIT_BEFORE_DEACTIVATION_TIMEOUT, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "ps_c_wait_before_deactivation_timeout");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, ps_c_wait_before_deactivation_timeout);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, ps_c_wait_before_deactivation_timeout);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.bip32_indication_control");
    if (cli_parm != NULL)
    {
        bcmolt_control_state val;
        val = (bcmolt_control_state) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, bip32_indication_control, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_ni, bip32_indication_control, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_NI_CFG_ID_BIP32_INDICATION_CONTROL, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "bip32_indication_control");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, bip32_indication_control);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, bip32_indication_control);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_ni, pon_status) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_ni, available_bandwidth) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_ni, number_of_active_onus) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_ni, number_of_active_standby_onus) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_ni, prbs_status) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_ni, pon_distance) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_ni, ranging_window_size) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_ni, preassigned_equalization_delay) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_ni, eqd_cycles_number) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_ni, power_level) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_ni, ds_fec_mode) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_ni, drift_control) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_ni, ds_ber_reporting_interval) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_ni, los_alarm_threshold) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_ni, los_initial_value) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_ni, onu_alarms_thresholds) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_ni, ber_monitor) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_ni, ploam_ack_timeout) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_ni, onu_activation) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_ni, sn_acquisition) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_ni, key_exchange) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_ni, protection_switching) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_ni, cbr_rt_allocation_profile) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_ni, cbr_nrt_allocation_profile) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_ni, dba) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_ni, power_management) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_ni, rogue_onu_detection_process) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_ni, periodic_standby_pon_monitoring) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_ni, prbs_checker) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_ni, prbs_generator) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_ni, min_data_alloc_id) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_ni, automatic_onu_deactivation) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_ni, us_bandwidth_limit) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_ni, all_onus) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_ni, all_mcast_gem_ports) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_ni, debug) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_ni, onu_upgrade_params) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_ni, ps_c_wait_before_deactivation_timeout) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_ni, bip32_indication_control))
    {
        BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, all_properties);
        bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_ni, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);
    bcmcli_log("bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_ni_stat_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_ni_stat stat;       /**< declare main API struct */
    bcmolt_gpon_ni_key key = { };   /**< declare key */
    bcmos_bool clear_on_read;       /**< declare 'clear on read' flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_ni_stat stat;\n");
    bcmcli_log("bcmolt_gpon_ni_key key = {  };\n");
    bcmcli_log("bcmos_bool clear_on_read;\n");
    apicli_print_start(session, "bcmolt_stat_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_NI_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* set stat flags from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "clear");
    if (cli_parm != NULL)
    {
        clear_on_read = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "clear is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("clear_on_read = %s;\n", (clear_on_read) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* init the API struct */
    BCMOLT_STAT_INIT(&stat, gpon_ni, key);
    bcmcli_log("BCMOLT_STAT_INIT(&stat, gpon_ni, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "fec_codewords");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_ni, fec_codewords);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_ni, fec_codewords);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "fec_codewords_uncorrected");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_ni, fec_codewords_uncorrected);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_ni, fec_codewords_uncorrected);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "bip8_bytes");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_ni, bip8_bytes);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_ni, bip8_bytes);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "bip8_errors");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_ni, bip8_errors);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_ni, bip8_errors);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_gem_packets");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_ni, rx_gem_packets);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_ni, rx_gem_packets);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_gem_dropped");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_ni, rx_gem_dropped);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_ni, rx_gem_dropped);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_gem_idle");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_ni, rx_gem_idle);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_ni, rx_gem_idle);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_gem_corrected");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_ni, rx_gem_corrected);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_ni, rx_gem_corrected);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_gem_illegal");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_ni, rx_gem_illegal);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_ni, rx_gem_illegal);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_allocations_valid");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_ni, rx_allocations_valid);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_ni, rx_allocations_valid);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_allocations_invalid");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_ni, rx_allocations_invalid);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_ni, rx_allocations_invalid);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_allocations_disabled");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_ni, rx_allocations_disabled);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_ni, rx_allocations_disabled);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_ploams");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_ni, rx_ploams);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_ni, rx_ploams);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_ploams_non_idle");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_ni, rx_ploams_non_idle);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_ni, rx_ploams_non_idle);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_ploams_error");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_ni, rx_ploams_error);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_ni, rx_ploams_error);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_ploams_dropped");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_ni, rx_ploams_dropped);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_ni, rx_ploams_dropped);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_cpu");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_ni, rx_cpu);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_ni, rx_cpu);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_omci");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_ni, rx_omci);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_ni, rx_omci);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_omci_packets_crc_error");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_ni, rx_omci_packets_crc_error);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_ni, rx_omci_packets_crc_error);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_dropped_too_short");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_ni, rx_dropped_too_short);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_ni, rx_dropped_too_short);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_dropped_too_long");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_ni, rx_dropped_too_long);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_ni, rx_dropped_too_long);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_crc_errors");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_ni, rx_crc_errors);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_ni, rx_crc_errors);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_key_errors");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_ni, rx_key_errors);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_ni, rx_key_errors);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_fragments_errors");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_ni, rx_fragments_errors);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_ni, rx_fragments_errors);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_packets_dropped");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_ni, rx_packets_dropped);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_ni, rx_packets_dropped);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_gem");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_ni, tx_gem);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_ni, tx_gem);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_ploams");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_ni, tx_ploams);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_ni, tx_ploams);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_gem_fragments");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_ni, tx_gem_fragments);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_ni, tx_gem_fragments);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_cpu");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_ni, tx_cpu);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_ni, tx_cpu);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_omci");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_ni, tx_omci);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_ni, tx_omci);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_cpu_omci_packets_dropped");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_ni, tx_cpu_omci_packets_dropped);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_ni, tx_cpu_omci_packets_dropped);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_dropped_illegal_length");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_ni, tx_dropped_illegal_length);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_ni, tx_dropped_illegal_length);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_dropped_tpid_miss");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_ni, tx_dropped_tpid_miss);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_ni, tx_dropped_tpid_miss);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_dropped_vid_miss");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_ni, tx_dropped_vid_miss);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_ni, tx_dropped_vid_miss);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_STAT_PROP_IS_SET(&stat, gpon_ni, fec_codewords) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_ni, fec_codewords_uncorrected) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_ni, bip8_bytes) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_ni, bip8_errors) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_ni, rx_gem_packets) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_ni, rx_gem_dropped) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_ni, rx_gem_idle) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_ni, rx_gem_corrected) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_ni, rx_gem_illegal) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_ni, rx_allocations_valid) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_ni, rx_allocations_invalid) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_ni, rx_allocations_disabled) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_ni, rx_ploams) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_ni, rx_ploams_non_idle) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_ni, rx_ploams_error) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_ni, rx_ploams_dropped) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_ni, rx_cpu) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_ni, rx_omci) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_ni, rx_omci_packets_crc_error) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_ni, rx_dropped_too_short) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_ni, rx_dropped_too_long) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_ni, rx_crc_errors) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_ni, rx_key_errors) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_ni, rx_fragments_errors) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_ni, rx_packets_dropped) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_ni, tx_gem) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_ni, tx_ploams) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_ni, tx_gem_fragments) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_ni, tx_cpu) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_ni, tx_omci) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_ni, tx_cpu_omci_packets_dropped) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_ni, tx_dropped_illegal_length) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_ni, tx_dropped_tpid_miss) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_ni, tx_dropped_vid_miss))
    {
        BCMOLT_STAT_PROP_GET(&stat, gpon_ni, all_properties);
        bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_ni, all_properties);\n");
    }

    /* call API */
    err = bcmolt_stat_get(device_id, &stat.hdr, clear_on_read);
    bcmcli_log("bcmolt_stat_get(device_id, &stat.hdr, clear_on_read);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &stat.hdr.hdr);
    }

    apicli_print_complete(session, err, stat.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_ni_oper_set_pon_state_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_ni_set_pon_state oper;  /**< declare main API struct */
    bcmolt_gpon_ni_key key = { };       /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_ni_set_pon_state oper;\n");
    bcmcli_log("bcmolt_gpon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_NI_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, gpon_ni, set_pon_state, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, gpon_ni, set_pon_state, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "pon_state");
    if (cli_parm != NULL)
    {
        bcmolt_pon_operation val;
        val = (bcmolt_pon_operation) cli_parm->value.enum_val;
        BCMOLT_OPER_PROP_SET(&oper, gpon_ni, set_pon_state, pon_state, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, gpon_ni, set_pon_state, pon_state, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_OPER, BCMOLT_GPON_NI_OPER_ID_SET_PON_STATE, BCMOLT_GPON_NI_SET_PON_STATE_ID_PON_STATE, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_ni_oper_reset_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_ni_reset oper;      /**< declare main API struct */
    bcmolt_gpon_ni_key key = { };   /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_ni_reset oper;\n");
    bcmcli_log("bcmolt_gpon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_NI_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, gpon_ni, reset, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, gpon_ni, reset, key);\n");

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_ni_oper_disable_serial_number_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_ni_disable_serial_number oper;  /**< declare main API struct */
    bcmolt_gpon_ni_key key = { };               /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_ni_disable_serial_number oper;\n");
    bcmcli_log("bcmolt_gpon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_NI_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, gpon_ni, disable_serial_number, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, gpon_ni, disable_serial_number, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "control");
    if (cli_parm != NULL)
    {
        bcmolt_disable_serial_number_control val;
        val = (bcmolt_disable_serial_number_control) cli_parm->value.enum_val;
        BCMOLT_OPER_PROP_SET(&oper, gpon_ni, disable_serial_number, control, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, gpon_ni, disable_serial_number, control, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_OPER, BCMOLT_GPON_NI_OPER_ID_DISABLE_SERIAL_NUMBER, BCMOLT_GPON_NI_DISABLE_SERIAL_NUMBER_ID_CONTROL, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "serial_number.");
    if (cli_parm != NULL)
    {
        bcmolt_serial_number val = { };
        cli_parm = bcmcli_find_named_parm(session, "serial_number.vendor_id");
        if (cli_parm != NULL)
        {
            if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 4)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "buffer serial_number.vendor_id must have 4 bytes\n");
                return BCM_ERR_PARM;
            }

            bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
            bcmolt_buf_read(&cli_parm->value.buffer, val.vendor_id, 4);
        }
        else
        {
            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 (bcmolt_buf_get_used(&cli_parm->value.buffer) != 4)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "buffer serial_number.vendor_specific must have 4 bytes\n");
                return BCM_ERR_PARM;
            }

            bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
            bcmolt_buf_read(&cli_parm->value.buffer, val.vendor_specific, 4);
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "serial_number.vendor_specific is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_OPER_PROP_SET(&oper, gpon_ni, disable_serial_number, serial_number, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_serial_number val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_OPER, BCMOLT_GPON_NI_OPER_ID_DISABLE_SERIAL_NUMBER, BCMOLT_GPON_NI_DISABLE_SERIAL_NUMBER_ID_SERIAL_NUMBER, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, gpon_ni, disable_serial_number, serial_number, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_ni_oper_single_request_standby_pon_monitoring_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_ni_single_request_standby_pon_monitoring oper;  /**< declare main API struct */
    bcmolt_gpon_ni_key key = { };   /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_ni_single_request_standby_pon_monitoring oper;\n");
    bcmcli_log("bcmolt_gpon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_NI_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, gpon_ni, single_request_standby_pon_monitoring, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, gpon_ni, single_request_standby_pon_monitoring, key);\n");

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_ni_oper_set_onu_state_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_ni_set_onu_state oper;  /**< declare main API struct */
    bcmolt_gpon_ni_key key = { };       /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_ni_set_onu_state oper;\n");
    bcmcli_log("bcmolt_gpon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_NI_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, gpon_ni, set_onu_state, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, gpon_ni, set_onu_state, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "onu_state");
    if (cli_parm != NULL)
    {
        bcmolt_onu_operation val;
        val = (bcmolt_onu_operation) cli_parm->value.enum_val;
        BCMOLT_OPER_PROP_SET(&oper, gpon_ni, set_onu_state, onu_state, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, gpon_ni, set_onu_state, onu_state, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_OPER, BCMOLT_GPON_NI_OPER_ID_SET_ONU_STATE, BCMOLT_GPON_NI_SET_ONU_STATE_ID_ONU_STATE, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_ni_proxy_cpu_packets_send(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_ni_cpu_packets proxy;   /**< declare main API struct */
    bcmolt_gpon_ni_key key = { };       /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_ni_cpu_packets proxy;\n");
    bcmcli_log("bcmolt_gpon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_proxy_send");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_NI_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_PROXY_INIT(&proxy, gpon_ni, cpu_packets, key);
    bcmcli_log("BCMOLT_PROXY_INIT(&proxy, gpon_ni, cpu_packets, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "packet_type");
    if (cli_parm != NULL)
    {
        bcmolt_packet_type val;
        val = (bcmolt_packet_type) cli_parm->value.enum_val;
        BCMOLT_PROXY_PROP_SET(&proxy, gpon_ni, cpu_packets, packet_type, val);
        bcmcli_log("BCMOLT_PROXY_PROP_SET(&proxy, gpon_ni, cpu_packets, packet_type, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_PROXY, BCMOLT_GPON_NI_PROXY_ID_CPU_PACKETS, BCMOLT_GPON_NI_CPU_PACKETS_ID_PACKET_TYPE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "calc_crc");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_PROXY_PROP_SET(&proxy, gpon_ni, cpu_packets, calc_crc, val);
        bcmcli_log("BCMOLT_PROXY_PROP_SET(&proxy, gpon_ni, cpu_packets, calc_crc, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_PROXY, BCMOLT_GPON_NI_PROXY_ID_CPU_PACKETS, BCMOLT_GPON_NI_CPU_PACKETS_ID_CALC_CRC, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "gem_port_list");
    if (cli_parm != NULL)
    {
        bcmolt_gpon_gem_id_list_u8_max_16 val = { };
        int32_t i0;
        val.val = apicli_byte_pool_calloc(byte_pool, cli_parm->array_size * sizeof(*val.val));
        if (val.val == NULL)
        {
            apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
            return BCM_ERR_NOMEM;
        }

        val.len = cli_parm->array_size;
        for (i0 = 0; i0 < val.len; i0++)
        {
            val.val[i0] = (bcmolt_gpon_gem_id) cli_parm->values[i0].unumber;
        }

        BCMOLT_PROXY_PROP_SET(&proxy, gpon_ni, cpu_packets, gem_port_list, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_gpon_gem_id_list_u8_max_16 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_PROXY, BCMOLT_GPON_NI_PROXY_ID_CPU_PACKETS, BCMOLT_GPON_NI_CPU_PACKETS_ID_GEM_PORT_LIST, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_PROXY_PROP_SET(&proxy, gpon_ni, cpu_packets, gem_port_list, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "buffer");
    if (cli_parm != NULL)
    {
        bcmolt_u8_list_u32_max_2048 val = { };
        val.len = bcmolt_buf_get_used(&cli_parm->value.buffer);
        val.val = apicli_byte_pool_calloc(byte_pool, val.len);
        if (val.val == NULL)
        {
            apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
            return BCM_ERR_NOMEM;
        }

        bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
        bcmolt_buf_read(&cli_parm->value.buffer, val.val, val.len);
        BCMOLT_PROXY_PROP_SET(&proxy, gpon_ni, cpu_packets, buffer, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_u8_list_u32_max_2048 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_PROXY, BCMOLT_GPON_NI_PROXY_ID_CPU_PACKETS, BCMOLT_GPON_NI_CPU_PACKETS_ID_BUFFER, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_PROXY_PROP_SET(&proxy, gpon_ni, cpu_packets, buffer, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_proxy_send(device_id, &proxy.hdr);
    bcmcli_log("bcmolt_proxy_send(device_id, &proxy.hdr);\n");
    apicli_print_complete(session, err, proxy.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_ni_proxy_broadcast_ploam_packet_send(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_ni_broadcast_ploam_packet proxy;    /**< declare main API struct */
    bcmolt_gpon_ni_key key = { };                   /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_ni_broadcast_ploam_packet proxy;\n");
    bcmcli_log("bcmolt_gpon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_proxy_send");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_NI_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_PROXY_INIT(&proxy, gpon_ni, broadcast_ploam_packet, key);
    bcmcli_log("BCMOLT_PROXY_INIT(&proxy, gpon_ni, broadcast_ploam_packet, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_parm_by_prefix(session, "ploam.");
    if (cli_parm != NULL)
    {
        bcmolt_arr_u8_12 val = { };
        cli_parm = bcmcli_find_named_parm(session, "ploam.arr");
        if (cli_parm != NULL)
        {
            if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 12)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "buffer ploam.arr must have 12 bytes\n");
                return BCM_ERR_PARM;
            }

            bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
            bcmolt_buf_read(&cli_parm->value.buffer, val.arr, 12);
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ploam.arr is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_PROXY_PROP_SET(&proxy, gpon_ni, broadcast_ploam_packet, ploam, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_arr_u8_12 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_PROXY, BCMOLT_GPON_NI_PROXY_ID_BROADCAST_PLOAM_PACKET, BCMOLT_GPON_NI_BROADCAST_PLOAM_PACKET_ID_PLOAM, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_PROXY_PROP_SET(&proxy, gpon_ni, broadcast_ploam_packet, ploam, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_proxy_send(device_id, &proxy.hdr);
    bcmcli_log("bcmolt_proxy_send(device_id, &proxy.hdr);\n");
    apicli_print_complete(session, err, proxy.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_ni_oper_rogue_detection_window_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_ni_rogue_detection_window oper; /**< declare main API struct */
    bcmolt_gpon_ni_key key = { };               /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_ni_rogue_detection_window oper;\n");
    bcmcli_log("bcmolt_gpon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_NI_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, gpon_ni, rogue_detection_window, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, gpon_ni, rogue_detection_window, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "window_type");
    if (cli_parm != NULL)
    {
        bcmolt_rogue_detection_window val;
        val = (bcmolt_rogue_detection_window) cli_parm->value.enum_val;
        BCMOLT_OPER_PROP_SET(&oper, gpon_ni, rogue_detection_window, window_type, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, gpon_ni, rogue_detection_window, window_type, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_OPER, BCMOLT_GPON_NI_OPER_ID_ROGUE_DETECTION_WINDOW, BCMOLT_GPON_NI_ROGUE_DETECTION_WINDOW_ID_WINDOW_TYPE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "alloc_id");
    if (cli_parm != NULL)
    {
        bcmolt_gpon_alloc_id val;
        val = (bcmolt_gpon_alloc_id) cli_parm->value.unumber;
        BCMOLT_OPER_PROP_SET(&oper, gpon_ni, rogue_detection_window, alloc_id, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, gpon_ni, rogue_detection_window, alloc_id, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_OPER, BCMOLT_GPON_NI_OPER_ID_ROGUE_DETECTION_WINDOW, BCMOLT_GPON_NI_ROGUE_DETECTION_WINDOW_ID_ALLOC_ID, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        bcmolt_gpon_onu_id val;
        val = (bcmolt_gpon_onu_id) cli_parm->value.unumber;
        BCMOLT_OPER_PROP_SET(&oper, gpon_ni, rogue_detection_window, onu_id, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, gpon_ni, rogue_detection_window, onu_id, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_OPER, BCMOLT_GPON_NI_OPER_ID_ROGUE_DETECTION_WINDOW, BCMOLT_GPON_NI_ROGUE_DETECTION_WINDOW_ID_ONU_ID, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "second_ranging_window");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_OPER_PROP_SET(&oper, gpon_ni, rogue_detection_window, second_ranging_window, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, gpon_ni, rogue_detection_window, second_ranging_window, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_OPER, BCMOLT_GPON_NI_OPER_ID_ROGUE_DETECTION_WINDOW, BCMOLT_GPON_NI_ROGUE_DETECTION_WINDOW_ID_SECOND_RANGING_WINDOW, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_ni_oper_tod_request_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_ni_tod_request oper;    /**< declare main API struct */
    bcmolt_gpon_ni_key key = { };       /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_ni_tod_request oper;\n");
    bcmcli_log("bcmolt_gpon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_NI_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, gpon_ni, tod_request, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, gpon_ni, tod_request, key);\n");

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_ni_oper_protection_switching_type_c_set_multiple_onu_state_submit(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_ni_protection_switching_type_c_set_multiple_onu_state oper; /**< declare main API struct */
    bcmolt_gpon_ni_key key = { };   /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_ni_protection_switching_type_c_set_multiple_onu_state oper;\n");
    bcmcli_log("bcmolt_gpon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_NI_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, gpon_ni, protection_switching_type_c_set_multiple_onu_state, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, gpon_ni, protection_switching_type_c_set_multiple_onu_state, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "onu_state");
    if (cli_parm != NULL)
    {
        bcmolt_switch_over_type_c_onu_state val;
        val = (bcmolt_switch_over_type_c_onu_state) cli_parm->value.enum_val;
        BCMOLT_OPER_PROP_SET(&oper, gpon_ni, protection_switching_type_c_set_multiple_onu_state, onu_state, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, gpon_ni, protection_switching_type_c_set_multiple_onu_state, onu_state, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_OPER, BCMOLT_GPON_NI_OPER_ID_PROTECTION_SWITCHING_TYPE_C_SET_MULTIPLE_ONU_STATE, BCMOLT_GPON_NI_PROTECTION_SWITCHING_TYPE_C_SET_MULTIPLE_ONU_STATE_ID_ONU_STATE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_list");
    if (cli_parm != NULL)
    {
        bcmolt_gpon_onu_id_list_u32_max_256 val = { };
        int32_t i0;
        val.val = apicli_byte_pool_calloc(byte_pool, cli_parm->array_size * sizeof(*val.val));
        if (val.val == NULL)
        {
            apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
            return BCM_ERR_NOMEM;
        }

        val.len = cli_parm->array_size;
        for (i0 = 0; i0 < val.len; i0++)
        {
            val.val[i0] = (bcmolt_gpon_onu_id) cli_parm->values[i0].unumber;
        }

        BCMOLT_OPER_PROP_SET(&oper, gpon_ni, protection_switching_type_c_set_multiple_onu_state, onu_list, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_gpon_onu_id_list_u32_max_256 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_OPER, BCMOLT_GPON_NI_OPER_ID_PROTECTION_SWITCHING_TYPE_C_SET_MULTIPLE_ONU_STATE, BCMOLT_GPON_NI_PROTECTION_SWITCHING_TYPE_C_SET_MULTIPLE_ONU_STATE_ID_ONU_LIST, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, gpon_ni, protection_switching_type_c_set_multiple_onu_state, onu_list, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_ni_oper_start_onu_upgrade_submit(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_ni_start_onu_upgrade oper;  /**< declare main API struct */
    bcmolt_gpon_ni_key key = { };           /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_ni_start_onu_upgrade oper;\n");
    bcmcli_log("bcmolt_gpon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_NI_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, gpon_ni, start_onu_upgrade, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, gpon_ni, start_onu_upgrade, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "list_of_onu_ids");
    if (cli_parm != NULL)
    {
        bcmolt_pon_onu_id_list_u32 val = { };
        int32_t i0;
        val.val = apicli_byte_pool_calloc(byte_pool, cli_parm->array_size * sizeof(*val.val));
        if (val.val == NULL)
        {
            apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
            return BCM_ERR_NOMEM;
        }

        val.len = cli_parm->array_size;
        for (i0 = 0; i0 < val.len; i0++)
        {
            val.val[i0] = (bcmolt_pon_onu_id) cli_parm->values[i0].unumber;
        }

        BCMOLT_OPER_PROP_SET(&oper, gpon_ni, start_onu_upgrade, list_of_onu_ids, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_pon_onu_id_list_u32 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_OPER, BCMOLT_GPON_NI_OPER_ID_START_ONU_UPGRADE, BCMOLT_GPON_NI_START_ONU_UPGRADE_ID_LIST_OF_ONU_IDS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, gpon_ni, start_onu_upgrade, list_of_onu_ids, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_ni_stat_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_ni_stat_cfg stat_cfg;   /**< declare main API struct */
    bcmolt_gpon_ni_key key = { };       /**< declare key */
    bcmolt_gpon_ni_stat_id stat_id;     /**< declare stat ID */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_ni_stat_cfg stat_cfg;\n");
    bcmcli_log("bcmolt_gpon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_stat_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_NI_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* set stat ID from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "sub");
    if (cli_parm != NULL)
    {
        stat_id = (bcmolt_gpon_ni_stat_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
        return BCM_ERR_PARM;
    }

    /* init the API struct */
    switch (stat_id)
    {
        case BCMOLT_GPON_NI_STAT_ID_FEC_CODEWORDS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, fec_codewords, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, fec_codewords, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_FEC_CODEWORDS_UNCORRECTED:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, fec_codewords_uncorrected, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, fec_codewords_uncorrected, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_BIP8_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, bip8_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, bip8_bytes, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_BIP8_ERRORS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, bip8_errors, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, bip8_errors, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_RX_GEM_PACKETS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_gem_packets, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_gem_packets, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_RX_GEM_DROPPED:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_gem_dropped, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_gem_dropped, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_RX_GEM_IDLE:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_gem_idle, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_gem_idle, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_RX_GEM_CORRECTED:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_gem_corrected, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_gem_corrected, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_RX_GEM_ILLEGAL:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_gem_illegal, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_gem_illegal, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_RX_ALLOCATIONS_VALID:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_allocations_valid, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_allocations_valid, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_RX_ALLOCATIONS_INVALID:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_allocations_invalid, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_allocations_invalid, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_RX_ALLOCATIONS_DISABLED:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_allocations_disabled, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_allocations_disabled, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_RX_PLOAMS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_ploams, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_ploams, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_RX_PLOAMS_NON_IDLE:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_ploams_non_idle, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_ploams_non_idle, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_RX_PLOAMS_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_ploams_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_ploams_error, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_RX_PLOAMS_DROPPED:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_ploams_dropped, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_ploams_dropped, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_RX_CPU:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_cpu, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_cpu, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_RX_OMCI:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_omci, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_omci, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_RX_OMCI_PACKETS_CRC_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_omci_packets_crc_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_omci_packets_crc_error, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_RX_DROPPED_TOO_SHORT:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_dropped_too_short, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_dropped_too_short, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_RX_DROPPED_TOO_LONG:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_dropped_too_long, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_dropped_too_long, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_RX_CRC_ERRORS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_crc_errors, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_crc_errors, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_RX_KEY_ERRORS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_key_errors, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_key_errors, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_RX_FRAGMENTS_ERRORS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_fragments_errors, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_fragments_errors, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_RX_PACKETS_DROPPED:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_packets_dropped, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_packets_dropped, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_TX_GEM:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, tx_gem, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, tx_gem, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_TX_PLOAMS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, tx_ploams, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, tx_ploams, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_TX_GEM_FRAGMENTS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, tx_gem_fragments, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, tx_gem_fragments, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_TX_CPU:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, tx_cpu, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, tx_cpu, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_TX_OMCI:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, tx_omci, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, tx_omci, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_TX_CPU_OMCI_PACKETS_DROPPED:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, tx_cpu_omci_packets_dropped, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, tx_cpu_omci_packets_dropped, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_TX_DROPPED_ILLEGAL_LENGTH:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, tx_dropped_illegal_length, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, tx_dropped_illegal_length, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_TX_DROPPED_TPID_MISS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, tx_dropped_tpid_miss, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, tx_dropped_tpid_miss, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_TX_DROPPED_VID_MISS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, tx_dropped_vid_miss, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, tx_dropped_vid_miss, key);\n");
            break;
        default:
            apicli_print_complete(session, BCM_ERR_RANGE, "\n");
            return BCM_ERR_RANGE;
    }

    /* call API */
    err = bcmolt_stat_cfg_get(device_id, &stat_cfg.hdr);
    bcmcli_log("bcmolt_stat_cfg_get(device_id, &stat_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &stat_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, stat_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_ni_stat_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_ni_stat_cfg stat_cfg;   /**< declare main API struct */
    bcmolt_gpon_ni_key key = { };       /**< declare key */
    bcmolt_gpon_ni_stat_id stat_id;     /**< declare stat ID */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_ni_stat_cfg stat_cfg;\n");
    bcmcli_log("bcmolt_gpon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_stat_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_NI_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* set stat ID from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "sub");
    if (cli_parm != NULL)
    {
        stat_id = (bcmolt_gpon_ni_stat_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
        return BCM_ERR_PARM;
    }

    /* init the API struct */
    switch (stat_id)
    {
        case BCMOLT_GPON_NI_STAT_ID_FEC_CODEWORDS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, fec_codewords, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, fec_codewords, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_FEC_CODEWORDS_UNCORRECTED:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, fec_codewords_uncorrected, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, fec_codewords_uncorrected, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_BIP8_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, bip8_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, bip8_bytes, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_BIP8_ERRORS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, bip8_errors, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, bip8_errors, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_RX_GEM_PACKETS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_gem_packets, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_gem_packets, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_RX_GEM_DROPPED:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_gem_dropped, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_gem_dropped, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_RX_GEM_IDLE:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_gem_idle, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_gem_idle, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_RX_GEM_CORRECTED:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_gem_corrected, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_gem_corrected, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_RX_GEM_ILLEGAL:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_gem_illegal, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_gem_illegal, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_RX_ALLOCATIONS_VALID:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_allocations_valid, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_allocations_valid, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_RX_ALLOCATIONS_INVALID:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_allocations_invalid, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_allocations_invalid, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_RX_ALLOCATIONS_DISABLED:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_allocations_disabled, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_allocations_disabled, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_RX_PLOAMS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_ploams, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_ploams, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_RX_PLOAMS_NON_IDLE:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_ploams_non_idle, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_ploams_non_idle, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_RX_PLOAMS_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_ploams_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_ploams_error, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_RX_PLOAMS_DROPPED:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_ploams_dropped, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_ploams_dropped, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_RX_CPU:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_cpu, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_cpu, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_RX_OMCI:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_omci, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_omci, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_RX_OMCI_PACKETS_CRC_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_omci_packets_crc_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_omci_packets_crc_error, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_RX_DROPPED_TOO_SHORT:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_dropped_too_short, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_dropped_too_short, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_RX_DROPPED_TOO_LONG:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_dropped_too_long, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_dropped_too_long, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_RX_CRC_ERRORS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_crc_errors, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_crc_errors, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_RX_KEY_ERRORS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_key_errors, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_key_errors, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_RX_FRAGMENTS_ERRORS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_fragments_errors, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_fragments_errors, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_RX_PACKETS_DROPPED:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_packets_dropped, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, rx_packets_dropped, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_TX_GEM:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, tx_gem, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, tx_gem, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_TX_PLOAMS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, tx_ploams, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, tx_ploams, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_TX_GEM_FRAGMENTS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, tx_gem_fragments, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, tx_gem_fragments, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_TX_CPU:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, tx_cpu, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, tx_cpu, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_TX_OMCI:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, tx_omci, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, tx_omci, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_TX_CPU_OMCI_PACKETS_DROPPED:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, tx_cpu_omci_packets_dropped, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, tx_cpu_omci_packets_dropped, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_TX_DROPPED_ILLEGAL_LENGTH:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, tx_dropped_illegal_length, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, tx_dropped_illegal_length, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_TX_DROPPED_TPID_MISS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, tx_dropped_tpid_miss, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, tx_dropped_tpid_miss, key);\n");
            break;
        case BCMOLT_GPON_NI_STAT_ID_TX_DROPPED_VID_MISS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, tx_dropped_vid_miss, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_ni, tx_dropped_vid_miss, key);\n");
            break;
        default:
            apicli_print_complete(session, BCM_ERR_RANGE, "\n");
            return BCM_ERR_RANGE;
    }

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.");
    if (cli_parm != NULL)
    {
        bcmolt_stat_alarm_config val = { };
        cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.trigger.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.type");
            if (cli_parm != NULL)
            {
                val.trigger.type = (bcmolt_stat_condition_type) cli_parm->value.enum_val;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.type is not set\n");
                return BCM_ERR_PARM;
            }

            switch (val.trigger.type)
            {
                case BCMOLT_STAT_CONDITION_TYPE_RATE_THRESHOLD:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.rising");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_threshold.rising = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.rising is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.falling");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_threshold.falling = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.falling is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_RATE_RANGE:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.upper");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_range.upper = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.upper is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.lower");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_range.lower = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.lower is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_VALUE_THRESHOLD:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.limit");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.value_threshold.limit = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.limit is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_NONE:
                    break;
                default:
                    apicli_print_complete(session, BCM_ERR_RANGE, "\n");
                    return BCM_ERR_RANGE;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.soak.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "cfg.soak.active_soak_time");
            if (cli_parm != NULL)
            {
                val.soak.active_soak_time = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak.active_soak_time is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "cfg.soak.clear_soak_time");
            if (cli_parm != NULL)
            {
                val.soak.clear_soak_time = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak.clear_soak_time is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_STAT_CFG_PROP_SET(&stat_cfg, gpon_ni, cfg, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_stat_alarm_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_STAT_CFG, 0, BCMOLT_GPON_NI_STAT_CFG_ID_CFG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_STAT_CFG_PROP_SET(&stat_cfg, gpon_ni, cfg, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_stat_cfg_set(device_id, &stat_cfg.hdr);
    bcmcli_log("bcmolt_stat_cfg_set(device_id, &stat_cfg.hdr);\n");
    apicli_print_complete(session, err, stat_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_ni_auto_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_ni_auto_cfg auto_cfg;   /**< declare main API struct */
    bcmolt_gpon_ni_key key = { };       /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_ni_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_gpon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_get");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, gpon_ni, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, gpon_ni, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "activate_all_onus_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_ni, activate_all_onus_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_ni, activate_all_onus_completed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "cpu_packets_failure");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_ni, cpu_packets_failure);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_ni, cpu_packets_failure);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "deactivate_all_onus_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_ni, deactivate_all_onus_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_ni, deactivate_all_onus_completed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "disable_all_onus_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_ni, disable_all_onus_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_ni, disable_all_onus_completed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "enable_all_onus_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_ni, enable_all_onus_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_ni, enable_all_onus_completed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "los");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_ni, los);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_ni, los);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_discovered");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_ni, onu_discovered);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_ni, onu_discovered);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_upgrade_complete");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_ni, onu_upgrade_complete);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_ni, onu_upgrade_complete);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "protection_switching_onus_ranged");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_ni, protection_switching_onus_ranged);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_ni, protection_switching_onus_ranged);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "protection_switching_switchover_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_ni, protection_switching_switchover_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_ni, protection_switching_switchover_completed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "protection_switching_traffic_resume");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_ni, protection_switching_traffic_resume);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_ni, protection_switching_traffic_resume);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rogue_detection_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_ni, rogue_detection_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_ni, rogue_detection_completed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rogue_onu_special_map_cycle_start");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_ni, rogue_onu_special_map_cycle_start);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_ni, rogue_onu_special_map_cycle_start);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "serial_number_acquisition_cycle_start");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_ni, serial_number_acquisition_cycle_start);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_ni, serial_number_acquisition_cycle_start);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "standby_pon_monitoring_cycle_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_ni, standby_pon_monitoring_cycle_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_ni, standby_pon_monitoring_cycle_completed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_cleared");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_ni, stat_alarm_cleared);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_ni, stat_alarm_cleared);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_raised");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_ni, stat_alarm_raised);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_ni, stat_alarm_raised);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "state_change_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_ni, state_change_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_ni, state_change_completed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tod_request_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_ni, tod_request_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_ni, tod_request_completed);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_ni, activate_all_onus_completed) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_ni, cpu_packets_failure) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_ni, deactivate_all_onus_completed) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_ni, disable_all_onus_completed) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_ni, enable_all_onus_completed) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_ni, los) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_ni, onu_discovered) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_ni, onu_upgrade_complete) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_ni, protection_switching_onus_ranged) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_ni, protection_switching_switchover_completed) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_ni, protection_switching_traffic_resume) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_ni, rogue_detection_completed) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_ni, rogue_onu_special_map_cycle_start) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_ni, serial_number_acquisition_cycle_start) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_ni, standby_pon_monitoring_cycle_completed) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_ni, stat_alarm_cleared) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_ni, stat_alarm_raised) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_ni, state_change_completed) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_ni, tod_request_completed))
    {
        BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_ni, all_properties);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_ni, all_properties);\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &auto_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_ni_auto_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_ni_auto_cfg auto_cfg;   /**< declare main API struct */
    bcmolt_gpon_ni_key key = { };       /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_ni_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_gpon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_set");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, gpon_ni, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, gpon_ni, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "activate_all_onus_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_ni, activate_all_onus_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_ni, activate_all_onus_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_NI_AUTO_CFG_ID_ACTIVATE_ALL_ONUS_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "cpu_packets_failure");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_ni, cpu_packets_failure, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_ni, cpu_packets_failure, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_NI_AUTO_CFG_ID_CPU_PACKETS_FAILURE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "deactivate_all_onus_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_ni, deactivate_all_onus_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_ni, deactivate_all_onus_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_NI_AUTO_CFG_ID_DEACTIVATE_ALL_ONUS_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "disable_all_onus_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_ni, disable_all_onus_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_ni, disable_all_onus_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_NI_AUTO_CFG_ID_DISABLE_ALL_ONUS_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "enable_all_onus_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_ni, enable_all_onus_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_ni, enable_all_onus_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_NI_AUTO_CFG_ID_ENABLE_ALL_ONUS_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "los");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_ni, los, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_ni, los, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_NI_AUTO_CFG_ID_LOS, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_discovered");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_ni, onu_discovered, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_ni, onu_discovered, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_NI_AUTO_CFG_ID_ONU_DISCOVERED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_upgrade_complete");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_ni, onu_upgrade_complete, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_ni, onu_upgrade_complete, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_NI_AUTO_CFG_ID_ONU_UPGRADE_COMPLETE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "protection_switching_onus_ranged");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_ni, protection_switching_onus_ranged, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_ni, protection_switching_onus_ranged, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_ONUS_RANGED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "protection_switching_switchover_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_ni, protection_switching_switchover_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_ni, protection_switching_switchover_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "protection_switching_traffic_resume");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_ni, protection_switching_traffic_resume, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_ni, protection_switching_traffic_resume, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_TRAFFIC_RESUME, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rogue_detection_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_ni, rogue_detection_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_ni, rogue_detection_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_NI_AUTO_CFG_ID_ROGUE_DETECTION_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rogue_onu_special_map_cycle_start");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_ni, rogue_onu_special_map_cycle_start, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_ni, rogue_onu_special_map_cycle_start, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_NI_AUTO_CFG_ID_ROGUE_ONU_SPECIAL_MAP_CYCLE_START, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "serial_number_acquisition_cycle_start");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_ni, serial_number_acquisition_cycle_start, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_ni, serial_number_acquisition_cycle_start, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_NI_AUTO_CFG_ID_SERIAL_NUMBER_ACQUISITION_CYCLE_START, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "standby_pon_monitoring_cycle_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_ni, standby_pon_monitoring_cycle_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_ni, standby_pon_monitoring_cycle_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_NI_AUTO_CFG_ID_STANDBY_PON_MONITORING_CYCLE_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_cleared");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_ni, stat_alarm_cleared, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_ni, stat_alarm_cleared, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_NI_AUTO_CFG_ID_STAT_ALARM_CLEARED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_raised");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_ni, stat_alarm_raised, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_ni, stat_alarm_raised, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_NI_AUTO_CFG_ID_STAT_ALARM_RAISED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "state_change_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_ni, state_change_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_ni, state_change_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_NI_AUTO_CFG_ID_STATE_CHANGE_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "tod_request_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_ni, tod_request_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_ni, tod_request_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_NI_AUTO_CFG_ID_TOD_REQUEST_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);\n");
    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_onu_cfg_get(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_onu_cfg cfg;        /**< declare main API struct */
    bcmolt_gpon_onu_key key = { };  /**< declare key */
    uint8_t *list_mem;              /**< declare memory buffer for variable-sized lists */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_onu_cfg cfg;\n");
    bcmcli_log("bcmolt_gpon_onu_key key = {  };\n");
    bcmcli_log("uint8_t* list_mem;\n");
    apicli_print_start(session, "bcmolt_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_ONU_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        key.onu_id = (bcmolt_gpon_onu_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "onu_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.onu_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_ONU_KEY_ID_ONU_ID, &key.onu_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, gpon_onu, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, gpon_onu, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "onu_state");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_onu, onu_state);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_onu, onu_state);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "serial_number");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_onu, serial_number);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_onu, serial_number);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "password");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_onu, password);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_onu, password);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "auto_password_learning");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_onu, auto_password_learning);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_onu, auto_password_learning);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "us_fec");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_onu, us_fec);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_onu, us_fec);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "omci_port_id");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_onu, omci_port_id);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_onu, omci_port_id);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "ds_ber_reporting_interval");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_onu, ds_ber_reporting_interval);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_onu, ds_ber_reporting_interval);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "aes_encryption_key");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_onu, aes_encryption_key);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_onu, aes_encryption_key);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "alarm_state");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_onu, alarm_state);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_onu, alarm_state);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "ranging_time");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_onu, ranging_time);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_onu, ranging_time);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "disabled_after_discovery");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_onu, disabled_after_discovery);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_onu, disabled_after_discovery);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "deactivation_reason");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_onu, deactivation_reason);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_onu, deactivation_reason);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "all_gem_ports");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_onu, all_gem_ports);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_onu, all_gem_ports);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "all_allocs");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_onu, all_allocs);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_onu, all_allocs);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_ps_type_c");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_onu, onu_ps_type_c);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_onu, onu_ps_type_c);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "extended_guard_time");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_onu, extended_guard_time);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_onu, extended_guard_time);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_onu, onu_state) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_onu, serial_number) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_onu, password) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_onu, auto_password_learning) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_onu, us_fec) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_onu, omci_port_id) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_onu, ds_ber_reporting_interval) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_onu, aes_encryption_key) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_onu, alarm_state) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_onu, ranging_time) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_onu, disabled_after_discovery) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_onu, deactivation_reason) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_onu, all_gem_ports) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_onu, all_allocs) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_onu, onu_ps_type_c) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_onu, extended_guard_time))
    {
        BCMOLT_CFG_PROP_GET(&cfg, gpon_onu, all_properties);
        bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_onu, all_properties);\n");
    }

    /* set memory to use for variable-sized lists */
    list_mem = apicli_byte_pool_calloc(byte_pool, APICLI_DYNAMIC_LIST_BUFFER_SIZE);
    if (list_mem == NULL)
    {
        apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
        return BCM_ERR_NOMEM;
    }

    bcmcli_log("list_mem = bcmos_calloc(APICLI_DYNAMIC_LIST_BUFFER_SIZE);\n");
    BCMOLT_CFG_LIST_BUF_SET(&cfg, gpon_onu, list_mem, APICLI_DYNAMIC_LIST_BUFFER_SIZE);
    bcmcli_log("BCMOLT_CFG_LIST_BUF_SET(&cfg, gpon_onu, list_mem, APICLI_DYNAMIC_LIST_BUFFER_SIZE);\n");

    /* call API */
    err = bcmolt_cfg_get(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_get(device_id, &cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_onu_cfg_set(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_onu_cfg cfg;        /**< declare main API struct */
    bcmolt_gpon_onu_key key = { };  /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_onu_cfg cfg;\n");
    bcmcli_log("bcmolt_gpon_onu_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_ONU_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        key.onu_id = (bcmolt_gpon_onu_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "onu_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.onu_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_ONU_KEY_ID_ONU_ID, &key.onu_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, gpon_onu, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, gpon_onu, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_parm_by_prefix(session, "serial_number.");
    if (cli_parm != NULL)
    {
        bcmolt_serial_number val = { };
        cli_parm = bcmcli_find_named_parm(session, "serial_number.vendor_id");
        if (cli_parm != NULL)
        {
            if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 4)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "buffer serial_number.vendor_id must have 4 bytes\n");
                return BCM_ERR_PARM;
            }

            bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
            bcmolt_buf_read(&cli_parm->value.buffer, val.vendor_id, 4);
        }
        else
        {
            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 (bcmolt_buf_get_used(&cli_parm->value.buffer) != 4)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "buffer serial_number.vendor_specific must have 4 bytes\n");
                return BCM_ERR_PARM;
            }

            bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
            bcmolt_buf_read(&cli_parm->value.buffer, val.vendor_specific, 4);
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "serial_number.vendor_specific is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, serial_number, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_serial_number val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_ONU_CFG_ID_SERIAL_NUMBER, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, serial_number, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "password.");
    if (cli_parm != NULL)
    {
        bcmolt_arr_u8_10 val = { };
        cli_parm = bcmcli_find_named_parm(session, "password.arr");
        if (cli_parm != NULL)
        {
            if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 10)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "buffer password.arr must have 10 bytes\n");
                return BCM_ERR_PARM;
            }

            bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
            bcmolt_buf_read(&cli_parm->value.buffer, val.arr, 10);
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "password.arr is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, password, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_arr_u8_10 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_ONU_CFG_ID_PASSWORD, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, password, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "auto_password_learning");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, auto_password_learning, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, auto_password_learning, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_ONU_CFG_ID_AUTO_PASSWORD_LEARNING, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "us_fec");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, us_fec, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, us_fec, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_ONU_CFG_ID_US_FEC, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "omci_port_id");
    if (cli_parm != NULL)
    {
        bcmolt_gpon_gem_id val;
        val = (bcmolt_gpon_gem_id) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, omci_port_id, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, omci_port_id, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_ONU_CFG_ID_OMCI_PORT_ID, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "ds_ber_reporting_interval");
    if (cli_parm != NULL)
    {
        bcmolt_ber_interval val;
        val = (bcmolt_ber_interval) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, ds_ber_reporting_interval, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, ds_ber_reporting_interval, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_ONU_CFG_ID_DS_BER_REPORTING_INTERVAL, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "aes_encryption_key.");
    if (cli_parm != NULL)
    {
        bcmolt_aes_key val = { };
        cli_parm = bcmcli_find_named_parm(session, "aes_encryption_key.bytes");
        if (cli_parm != NULL)
        {
            if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 16)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "buffer aes_encryption_key.bytes must have 16 bytes\n");
                return BCM_ERR_PARM;
            }

            bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
            bcmolt_buf_read(&cli_parm->value.buffer, val.bytes, 16);
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "aes_encryption_key.bytes is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, aes_encryption_key, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_aes_key val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_ONU_CFG_ID_AES_ENCRYPTION_KEY, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, aes_encryption_key, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "alarm_state.");
    if (cli_parm != NULL)
    {
        bcmolt_gpon_onu_alarm_state val = { };
        cli_parm = bcmcli_find_named_parm(session, "alarm_state.losi");
        if (cli_parm != NULL)
        {
            val.losi = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "alarm_state.losi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "alarm_state.lofi");
        if (cli_parm != NULL)
        {
            val.lofi = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "alarm_state.lofi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "alarm_state.loami");
        if (cli_parm != NULL)
        {
            val.loami = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "alarm_state.loami is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "alarm_state.dgi");
        if (cli_parm != NULL)
        {
            val.dgi = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "alarm_state.dgi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "alarm_state.tiwi");
        if (cli_parm != NULL)
        {
            val.tiwi = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "alarm_state.tiwi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "alarm_state.dowi");
        if (cli_parm != NULL)
        {
            val.dowi = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "alarm_state.dowi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "alarm_state.sufi");
        if (cli_parm != NULL)
        {
            val.sufi = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "alarm_state.sufi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "alarm_state.sfi");
        if (cli_parm != NULL)
        {
            val.sfi = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "alarm_state.sfi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "alarm_state.sdi");
        if (cli_parm != NULL)
        {
            val.sdi = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "alarm_state.sdi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "alarm_state.dfi");
        if (cli_parm != NULL)
        {
            val.dfi = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "alarm_state.dfi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "alarm_state.loai");
        if (cli_parm != NULL)
        {
            val.loai = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "alarm_state.loai is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "alarm_state.loki");
        if (cli_parm != NULL)
        {
            val.loki = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "alarm_state.loki is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, alarm_state, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_gpon_onu_alarm_state val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_ONU_CFG_ID_ALARM_STATE, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, alarm_state, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "ranging_time");
    if (cli_parm != NULL)
    {
        uint32_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, ranging_time, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, ranging_time, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_ONU_CFG_ID_RANGING_TIME, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_ps_type_c");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, onu_ps_type_c, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, onu_ps_type_c, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_ONU_CFG_ID_ONU_PS_TYPE_C, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "extended_guard_time.");
    if (cli_parm != NULL)
    {
        bcmolt_extended_guard_time val = { };
        cli_parm = bcmcli_find_named_parm(session, "extended_guard_time.additional_preburst_guard_time");
        if (cli_parm != NULL)
        {
            val.additional_preburst_guard_time = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "extended_guard_time.additional_preburst_guard_time is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "extended_guard_time.additional_postburst_guard_time");
        if (cli_parm != NULL)
        {
            val.additional_postburst_guard_time = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "extended_guard_time.additional_postburst_guard_time is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, extended_guard_time, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_extended_guard_time val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_ONU_CFG_ID_EXTENDED_GUARD_TIME, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, extended_guard_time, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_cfg_set(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_set(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_onu_cfg_clear(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_onu_cfg cfg;        /**< declare main API struct */
    bcmolt_gpon_onu_key key = { };  /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_onu_cfg cfg;\n");
    bcmcli_log("bcmolt_gpon_onu_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_clear");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_ONU_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        key.onu_id = (bcmolt_gpon_onu_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "onu_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.onu_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_ONU_KEY_ID_ONU_ID, &key.onu_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, gpon_onu, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, gpon_onu, key);\n");

    /* call API */
    err = bcmolt_cfg_clear(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_clear(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_onu_cfg_get_multi(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_onu_cfg cfg;        /**< declare main API struct */
    bcmolt_gpon_onu_key key = { };  /**< declare key */
    bcmolt_msg_set *msg_set = NULL; /**< declare message set */
    uint32_t max_msgs;              /**< declare max number of msgs to get */
    bcmos_bool invert_filter;       /**< declare filter invert flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_onu_cfg cfg;\n");
    bcmcli_log("bcmolt_gpon_onu_key key = {  };\n");
    bcmcli_log("bcmolt_msg_set* msg_set = NULL;\n");
    bcmcli_log("uint32_t max_msgs;\n");
    bcmcli_log("bcmos_bool invert_filter;\n");
    apicli_print_start(session, "bcmolt_cfg_get_multi");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_ONU_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        key.onu_id = (bcmolt_gpon_onu_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "onu_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.onu_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_ONU_KEY_ID_ONU_ID, &key.onu_id);
    bcmcli_log(";\n");

    /* set max number of msgs from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "max_msgs");
    if (cli_parm != NULL)
    {
        max_msgs = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "max_msgs is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("max_msgs = %d;\n", max_msgs);

    /* set filter invert flag from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "filter_invert");
    if (cli_parm != NULL)
    {
        invert_filter = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "filter_invert is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("invert_filter = %s;\n", (invert_filter) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* allocate message set */
    err = apicli_msg_set_alloc(byte_pool, BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);
    if (err != BCM_ERR_OK)
    {
        return err;
    }

    bcmcli_log("bcmolt_msg_set_alloc(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, gpon_onu, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, gpon_onu, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "filter.onu_state");
    if (cli_parm != NULL)
    {
        bcmolt_onu_state val;
        val = (bcmolt_onu_state) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, onu_state, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, onu_state, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_ONU_CFG_ID_ONU_STATE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_state");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_onu, onu_state);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_onu, onu_state);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.serial_number.");
    if (cli_parm != NULL)
    {
        bcmolt_serial_number val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.serial_number.vendor_id");
        if (cli_parm != NULL)
        {
            if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 4)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "buffer filter.serial_number.vendor_id must have 4 bytes\n");
                return BCM_ERR_PARM;
            }

            bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
            bcmolt_buf_read(&cli_parm->value.buffer, val.vendor_id, 4);
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.serial_number.vendor_id is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.serial_number.vendor_specific");
        if (cli_parm != NULL)
        {
            if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 4)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "buffer filter.serial_number.vendor_specific must have 4 bytes\n");
                return BCM_ERR_PARM;
            }

            bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
            bcmolt_buf_read(&cli_parm->value.buffer, val.vendor_specific, 4);
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.serial_number.vendor_specific is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, serial_number, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_serial_number val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_ONU_CFG_ID_SERIAL_NUMBER, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, serial_number, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "serial_number");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_onu, serial_number);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_onu, serial_number);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.password.");
    if (cli_parm != NULL)
    {
        bcmolt_arr_u8_10 val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.password.arr");
        if (cli_parm != NULL)
        {
            if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 10)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "buffer filter.password.arr must have 10 bytes\n");
                return BCM_ERR_PARM;
            }

            bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
            bcmolt_buf_read(&cli_parm->value.buffer, val.arr, 10);
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.password.arr is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, password, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_arr_u8_10 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_ONU_CFG_ID_PASSWORD, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, password, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "password");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_onu, password);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_onu, password);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.auto_password_learning");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, auto_password_learning, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, auto_password_learning, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_ONU_CFG_ID_AUTO_PASSWORD_LEARNING, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "auto_password_learning");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_onu, auto_password_learning);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_onu, auto_password_learning);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.us_fec");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, us_fec, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, us_fec, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_ONU_CFG_ID_US_FEC, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "us_fec");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_onu, us_fec);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_onu, us_fec);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.omci_port_id");
    if (cli_parm != NULL)
    {
        bcmolt_gpon_gem_id val;
        val = (bcmolt_gpon_gem_id) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, omci_port_id, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, omci_port_id, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_ONU_CFG_ID_OMCI_PORT_ID, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "omci_port_id");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_onu, omci_port_id);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_onu, omci_port_id);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.ds_ber_reporting_interval");
    if (cli_parm != NULL)
    {
        bcmolt_ber_interval val;
        val = (bcmolt_ber_interval) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, ds_ber_reporting_interval, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, ds_ber_reporting_interval, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_ONU_CFG_ID_DS_BER_REPORTING_INTERVAL, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "ds_ber_reporting_interval");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_onu, ds_ber_reporting_interval);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_onu, ds_ber_reporting_interval);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.aes_encryption_key.");
    if (cli_parm != NULL)
    {
        bcmolt_aes_key val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.aes_encryption_key.bytes");
        if (cli_parm != NULL)
        {
            if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 16)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "buffer filter.aes_encryption_key.bytes must have 16 bytes\n");
                return BCM_ERR_PARM;
            }

            bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
            bcmolt_buf_read(&cli_parm->value.buffer, val.bytes, 16);
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.aes_encryption_key.bytes is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, aes_encryption_key, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_aes_key val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_ONU_CFG_ID_AES_ENCRYPTION_KEY, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, aes_encryption_key, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "aes_encryption_key");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_onu, aes_encryption_key);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_onu, aes_encryption_key);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.alarm_state.");
    if (cli_parm != NULL)
    {
        bcmolt_gpon_onu_alarm_state val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.alarm_state.losi");
        if (cli_parm != NULL)
        {
            val.losi = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.losi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.alarm_state.lofi");
        if (cli_parm != NULL)
        {
            val.lofi = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.lofi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.alarm_state.loami");
        if (cli_parm != NULL)
        {
            val.loami = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.loami is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.alarm_state.dgi");
        if (cli_parm != NULL)
        {
            val.dgi = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.dgi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.alarm_state.tiwi");
        if (cli_parm != NULL)
        {
            val.tiwi = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.tiwi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.alarm_state.dowi");
        if (cli_parm != NULL)
        {
            val.dowi = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.dowi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.alarm_state.sufi");
        if (cli_parm != NULL)
        {
            val.sufi = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.sufi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.alarm_state.sfi");
        if (cli_parm != NULL)
        {
            val.sfi = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.sfi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.alarm_state.sdi");
        if (cli_parm != NULL)
        {
            val.sdi = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.sdi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.alarm_state.dfi");
        if (cli_parm != NULL)
        {
            val.dfi = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.dfi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.alarm_state.loai");
        if (cli_parm != NULL)
        {
            val.loai = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.loai is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.alarm_state.loki");
        if (cli_parm != NULL)
        {
            val.loki = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.loki is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, alarm_state, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_gpon_onu_alarm_state val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_ONU_CFG_ID_ALARM_STATE, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, alarm_state, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "alarm_state");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_onu, alarm_state);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_onu, alarm_state);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.ranging_time");
    if (cli_parm != NULL)
    {
        uint32_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, ranging_time, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, ranging_time, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_ONU_CFG_ID_RANGING_TIME, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "ranging_time");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_onu, ranging_time);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_onu, ranging_time);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.disabled_after_discovery");
    if (cli_parm != NULL)
    {
        bcmolt_status val;
        val = (bcmolt_status) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, disabled_after_discovery, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, disabled_after_discovery, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_ONU_CFG_ID_DISABLED_AFTER_DISCOVERY, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "disabled_after_discovery");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_onu, disabled_after_discovery);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_onu, disabled_after_discovery);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.deactivation_reason");
    if (cli_parm != NULL)
    {
        bcmolt_deactivation_reason val;
        val = (bcmolt_deactivation_reason) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, deactivation_reason, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, deactivation_reason, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_ONU_CFG_ID_DEACTIVATION_REASON, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "deactivation_reason");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_onu, deactivation_reason);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_onu, deactivation_reason);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.all_gem_ports.");
    if (cli_parm != NULL)
    {
        bcmolt_gpon_gem_port_with_state_list_u16_max_256 val = { };
        int32_t i0;
        val.val = apicli_byte_pool_calloc(byte_pool, cli_parm->array_size * sizeof(*val.val));
        if (val.val == NULL)
        {
            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, "filter.all_gem_ports.gem_id");
        if (cli_parm != NULL)
        {
            if (cli_parm->array_size != val.len)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.all_gem_ports.gem_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].gem_id = (bcmolt_gpon_gem_id) cli_parm->values[i0].unumber;
            }
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.all_gem_ports.state");
        if (cli_parm != NULL)
        {
            if (cli_parm->array_size != val.len)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.all_gem_ports.state 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].state = (bcmolt_gpon_gem_port_state) cli_parm->values[i0].enum_val;
            }
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, all_gem_ports, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_gpon_gem_port_with_state_list_u16_max_256 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_ONU_CFG_ID_ALL_GEM_PORTS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, all_gem_ports, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "all_gem_ports");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_onu, all_gem_ports);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_onu, all_gem_ports);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.all_allocs.");
    if (cli_parm != NULL)
    {
        bcmolt_gpon_alloc_with_state_list_u16_max_32 val = { };
        int32_t i1;
        val.val = apicli_byte_pool_calloc(byte_pool, cli_parm->array_size * sizeof(*val.val));
        if (val.val == NULL)
        {
            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, "filter.all_allocs.alloc_id");
        if (cli_parm != NULL)
        {
            if (cli_parm->array_size != val.len)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.all_allocs.alloc_id is a different size than other arrays in the struct\n");
                return BCM_ERR_PARM;
            }

            for (i1 = 0; i1 < val.len; i1++)
            {
                val.val[i1].alloc_id = (bcmolt_gpon_alloc_id) cli_parm->values[i1].unumber;
            }
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.all_allocs.state");
        if (cli_parm != NULL)
        {
            if (cli_parm->array_size != val.len)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.all_allocs.state is a different size than other arrays in the struct\n");
                return BCM_ERR_PARM;
            }

            for (i1 = 0; i1 < val.len; i1++)
            {
                val.val[i1].state = (bcmolt_alloc_state) cli_parm->values[i1].enum_val;
            }
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, all_allocs, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_gpon_alloc_with_state_list_u16_max_32 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_ONU_CFG_ID_ALL_ALLOCS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, all_allocs, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "all_allocs");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_onu, all_allocs);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_onu, all_allocs);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.onu_ps_type_c");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, onu_ps_type_c, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, onu_ps_type_c, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_ONU_CFG_ID_ONU_PS_TYPE_C, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_ps_type_c");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_onu, onu_ps_type_c);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_onu, onu_ps_type_c);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.extended_guard_time.");
    if (cli_parm != NULL)
    {
        bcmolt_extended_guard_time val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.extended_guard_time.additional_preburst_guard_time");
        if (cli_parm != NULL)
        {
            val.additional_preburst_guard_time = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.extended_guard_time.additional_preburst_guard_time is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.extended_guard_time.additional_postburst_guard_time");
        if (cli_parm != NULL)
        {
            val.additional_postburst_guard_time = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.extended_guard_time.additional_postburst_guard_time is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, extended_guard_time, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_extended_guard_time val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_ONU_CFG_ID_EXTENDED_GUARD_TIME, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_onu, extended_guard_time, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "extended_guard_time");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_onu, extended_guard_time);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_onu, extended_guard_time);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_onu, onu_state) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_onu, serial_number) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_onu, password) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_onu, auto_password_learning) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_onu, us_fec) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_onu, omci_port_id) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_onu, ds_ber_reporting_interval) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_onu, aes_encryption_key) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_onu, alarm_state) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_onu, ranging_time) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_onu, disabled_after_discovery) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_onu, deactivation_reason) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_onu, all_gem_ports) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_onu, all_allocs) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_onu, onu_ps_type_c) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_onu, extended_guard_time))
    {
        BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_onu, all_properties);
        bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_onu, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);
    bcmcli_log("bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_onu_stat_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_onu_stat stat;      /**< declare main API struct */
    bcmolt_gpon_onu_key key = { };  /**< declare key */
    bcmos_bool clear_on_read;       /**< declare 'clear on read' flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_onu_stat stat;\n");
    bcmcli_log("bcmolt_gpon_onu_key key = {  };\n");
    bcmcli_log("bcmos_bool clear_on_read;\n");
    apicli_print_start(session, "bcmolt_stat_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_ONU_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        key.onu_id = (bcmolt_gpon_onu_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "onu_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.onu_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_ONU_KEY_ID_ONU_ID, &key.onu_id);
    bcmcli_log(";\n");

    /* set stat flags from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "clear");
    if (cli_parm != NULL)
    {
        clear_on_read = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "clear is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("clear_on_read = %s;\n", (clear_on_read) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* init the API struct */
    BCMOLT_STAT_INIT(&stat, gpon_onu, key);
    bcmcli_log("BCMOLT_STAT_INIT(&stat, gpon_onu, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "fec_codewords");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_onu, fec_codewords);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_onu, fec_codewords);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "fec_bytes_corrected");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_onu, fec_bytes_corrected);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_onu, fec_bytes_corrected);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "fec_codewords_corrected");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_onu, fec_codewords_corrected);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_onu, fec_codewords_corrected);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "fec_codewords_uncorrected");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_onu, fec_codewords_uncorrected);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_onu, fec_codewords_uncorrected);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "bip8_bytes");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_onu, bip8_bytes);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_onu, bip8_bytes);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "bip8_errors");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_onu, bip8_errors);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_onu, bip8_errors);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_ploams_crc_error");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_onu, rx_ploams_crc_error);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_onu, rx_ploams_crc_error);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_ploams_non_idle");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_onu, rx_ploams_non_idle);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_onu, rx_ploams_non_idle);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "positive_drift");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_onu, positive_drift);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_onu, positive_drift);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "negative_drift");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_onu, negative_drift);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_onu, negative_drift);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_omci");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_onu, rx_omci);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_onu, rx_omci);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_omci_packets_crc_error");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_onu, rx_omci_packets_crc_error);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_onu, rx_omci_packets_crc_error);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "ber_reported");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_onu, ber_reported);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_onu, ber_reported);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "unreceived_burst");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_onu, unreceived_burst);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_onu, unreceived_burst);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "lcdg_errors");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_onu, lcdg_errors);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_onu, lcdg_errors);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rdi_errors");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_onu, rdi_errors);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_onu, rdi_errors);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_bytes");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_onu, rx_bytes);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_onu, rx_bytes);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_packets");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_onu, rx_packets);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_onu, rx_packets);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_bytes");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_onu, tx_bytes);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_onu, tx_bytes);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_packets");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, gpon_onu, tx_packets);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_onu, tx_packets);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_STAT_PROP_IS_SET(&stat, gpon_onu, fec_codewords) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_onu, fec_bytes_corrected) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_onu, fec_codewords_corrected) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_onu, fec_codewords_uncorrected) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_onu, bip8_bytes) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_onu, bip8_errors) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_onu, rx_ploams_crc_error) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_onu, rx_ploams_non_idle) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_onu, positive_drift) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_onu, negative_drift) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_onu, rx_omci) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_onu, rx_omci_packets_crc_error) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_onu, ber_reported) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_onu, unreceived_burst) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_onu, lcdg_errors) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_onu, rdi_errors) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_onu, rx_bytes) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_onu, rx_packets) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_onu, tx_bytes) && !BCMOLT_STAT_PROP_IS_SET(&stat, gpon_onu, tx_packets))
    {
        BCMOLT_STAT_PROP_GET(&stat, gpon_onu, all_properties);
        bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, gpon_onu, all_properties);\n");
    }

    /* call API */
    err = bcmolt_stat_get(device_id, &stat.hdr, clear_on_read);
    bcmcli_log("bcmolt_stat_get(device_id, &stat.hdr, clear_on_read);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &stat.hdr.hdr);
    }

    apicli_print_complete(session, err, stat.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_onu_oper_set_onu_state_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_onu_set_onu_state oper; /**< declare main API struct */
    bcmolt_gpon_onu_key key = { };      /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_onu_set_onu_state oper;\n");
    bcmcli_log("bcmolt_gpon_onu_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_ONU_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        key.onu_id = (bcmolt_gpon_onu_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "onu_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.onu_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_ONU_KEY_ID_ONU_ID, &key.onu_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, gpon_onu, set_onu_state, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, gpon_onu, set_onu_state, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "onu_state");
    if (cli_parm != NULL)
    {
        bcmolt_onu_operation val;
        val = (bcmolt_onu_operation) cli_parm->value.enum_val;
        BCMOLT_OPER_PROP_SET(&oper, gpon_onu, set_onu_state, onu_state, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, gpon_onu, set_onu_state, onu_state, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_OPER, BCMOLT_GPON_ONU_OPER_ID_SET_ONU_STATE, BCMOLT_GPON_ONU_SET_ONU_STATE_ID_ONU_STATE, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_onu_oper_rssi_measurement_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_onu_rssi_measurement oper;  /**< declare main API struct */
    bcmolt_gpon_onu_key key = { };          /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_onu_rssi_measurement oper;\n");
    bcmcli_log("bcmolt_gpon_onu_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_ONU_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        key.onu_id = (bcmolt_gpon_onu_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "onu_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.onu_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_ONU_KEY_ID_ONU_ID, &key.onu_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, gpon_onu, rssi_measurement, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, gpon_onu, rssi_measurement, key);\n");

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_onu_oper_change_power_level_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_onu_change_power_level oper;    /**< declare main API struct */
    bcmolt_gpon_onu_key key = { };              /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_onu_change_power_level oper;\n");
    bcmcli_log("bcmolt_gpon_onu_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_ONU_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        key.onu_id = (bcmolt_gpon_onu_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "onu_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.onu_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_ONU_KEY_ID_ONU_ID, &key.onu_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, gpon_onu, change_power_level, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, gpon_onu, change_power_level, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "power_level_action");
    if (cli_parm != NULL)
    {
        bcmolt_onu_power_level val;
        val = (bcmolt_onu_power_level) cli_parm->value.enum_val;
        BCMOLT_OPER_PROP_SET(&oper, gpon_onu, change_power_level, power_level_action, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, gpon_onu, change_power_level, power_level_action, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_OPER, BCMOLT_GPON_ONU_OPER_ID_CHANGE_POWER_LEVEL, BCMOLT_GPON_ONU_CHANGE_POWER_LEVEL_ID_POWER_LEVEL_ACTION, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_onu_proxy_cpu_packets_send(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_onu_cpu_packets proxy;  /**< declare main API struct */
    bcmolt_gpon_onu_key key = { };      /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_onu_cpu_packets proxy;\n");
    bcmcli_log("bcmolt_gpon_onu_key key = {  };\n");
    apicli_print_start(session, "bcmolt_proxy_send");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_ONU_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        key.onu_id = (bcmolt_gpon_onu_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "onu_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.onu_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_ONU_KEY_ID_ONU_ID, &key.onu_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_PROXY_INIT(&proxy, gpon_onu, cpu_packets, key);
    bcmcli_log("BCMOLT_PROXY_INIT(&proxy, gpon_onu, cpu_packets, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "packet_type");
    if (cli_parm != NULL)
    {
        bcmolt_packet_type val;
        val = (bcmolt_packet_type) cli_parm->value.enum_val;
        BCMOLT_PROXY_PROP_SET(&proxy, gpon_onu, cpu_packets, packet_type, val);
        bcmcli_log("BCMOLT_PROXY_PROP_SET(&proxy, gpon_onu, cpu_packets, packet_type, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_PROXY, BCMOLT_GPON_ONU_PROXY_ID_CPU_PACKETS, BCMOLT_GPON_ONU_CPU_PACKETS_ID_PACKET_TYPE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "calc_crc");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_PROXY_PROP_SET(&proxy, gpon_onu, cpu_packets, calc_crc, val);
        bcmcli_log("BCMOLT_PROXY_PROP_SET(&proxy, gpon_onu, cpu_packets, calc_crc, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_PROXY, BCMOLT_GPON_ONU_PROXY_ID_CPU_PACKETS, BCMOLT_GPON_ONU_CPU_PACKETS_ID_CALC_CRC, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "number_of_packets");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_PROXY_PROP_SET(&proxy, gpon_onu, cpu_packets, number_of_packets, val);
        bcmcli_log("BCMOLT_PROXY_PROP_SET(&proxy, gpon_onu, cpu_packets, number_of_packets, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_PROXY, BCMOLT_GPON_ONU_PROXY_ID_CPU_PACKETS, BCMOLT_GPON_ONU_CPU_PACKETS_ID_NUMBER_OF_PACKETS, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "packet_size");
    if (cli_parm != NULL)
    {
        uint16_t val;
        val = cli_parm->value.unumber;
        BCMOLT_PROXY_PROP_SET(&proxy, gpon_onu, cpu_packets, packet_size, val);
        bcmcli_log("BCMOLT_PROXY_PROP_SET(&proxy, gpon_onu, cpu_packets, packet_size, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_PROXY, BCMOLT_GPON_ONU_PROXY_ID_CPU_PACKETS, BCMOLT_GPON_ONU_CPU_PACKETS_ID_PACKET_SIZE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "buffer");
    if (cli_parm != NULL)
    {
        bcmolt_u8_list_u32_max_2048 val = { };
        val.len = bcmolt_buf_get_used(&cli_parm->value.buffer);
        val.val = apicli_byte_pool_calloc(byte_pool, val.len);
        if (val.val == NULL)
        {
            apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
            return BCM_ERR_NOMEM;
        }

        bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
        bcmolt_buf_read(&cli_parm->value.buffer, val.val, val.len);
        BCMOLT_PROXY_PROP_SET(&proxy, gpon_onu, cpu_packets, buffer, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_u8_list_u32_max_2048 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_PROXY, BCMOLT_GPON_ONU_PROXY_ID_CPU_PACKETS, BCMOLT_GPON_ONU_CPU_PACKETS_ID_BUFFER, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_PROXY_PROP_SET(&proxy, gpon_onu, cpu_packets, buffer, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_proxy_send(device_id, &proxy.hdr);
    bcmcli_log("bcmolt_proxy_send(device_id, &proxy.hdr);\n");
    apicli_print_complete(session, err, proxy.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_onu_proxy_ploam_packet_send(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_onu_ploam_packet proxy; /**< declare main API struct */
    bcmolt_gpon_onu_key key = { };      /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_onu_ploam_packet proxy;\n");
    bcmcli_log("bcmolt_gpon_onu_key key = {  };\n");
    apicli_print_start(session, "bcmolt_proxy_send");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_ONU_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        key.onu_id = (bcmolt_gpon_onu_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "onu_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.onu_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_ONU_KEY_ID_ONU_ID, &key.onu_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_PROXY_INIT(&proxy, gpon_onu, ploam_packet, key);
    bcmcli_log("BCMOLT_PROXY_INIT(&proxy, gpon_onu, ploam_packet, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_parm_by_prefix(session, "ploam.");
    if (cli_parm != NULL)
    {
        bcmolt_arr_u8_12 val = { };
        cli_parm = bcmcli_find_named_parm(session, "ploam.arr");
        if (cli_parm != NULL)
        {
            if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 12)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "buffer ploam.arr must have 12 bytes\n");
                return BCM_ERR_PARM;
            }

            bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
            bcmolt_buf_read(&cli_parm->value.buffer, val.arr, 12);
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ploam.arr is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_PROXY_PROP_SET(&proxy, gpon_onu, ploam_packet, ploam, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_arr_u8_12 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_PROXY, BCMOLT_GPON_ONU_PROXY_ID_PLOAM_PACKET, BCMOLT_GPON_ONU_PLOAM_PACKET_ID_PLOAM, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_PROXY_PROP_SET(&proxy, gpon_onu, ploam_packet, ploam, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_proxy_send(device_id, &proxy.hdr);
    bcmcli_log("bcmolt_proxy_send(device_id, &proxy.hdr);\n");
    apicli_print_complete(session, err, proxy.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_onu_stat_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_onu_stat_cfg stat_cfg;  /**< declare main API struct */
    bcmolt_gpon_onu_key key = { };      /**< declare key */
    bcmolt_gpon_onu_stat_id stat_id;    /**< declare stat ID */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_onu_stat_cfg stat_cfg;\n");
    bcmcli_log("bcmolt_gpon_onu_key key = {  };\n");
    apicli_print_start(session, "bcmolt_stat_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_ONU_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        key.onu_id = (bcmolt_gpon_onu_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "onu_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.onu_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_ONU_KEY_ID_ONU_ID, &key.onu_id);
    bcmcli_log(";\n");

    /* set stat ID from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "sub");
    if (cli_parm != NULL)
    {
        stat_id = (bcmolt_gpon_onu_stat_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
        return BCM_ERR_PARM;
    }

    /* init the API struct */
    switch (stat_id)
    {
        case BCMOLT_GPON_ONU_STAT_ID_FEC_CODEWORDS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, fec_codewords, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, fec_codewords, key);\n");
            break;
        case BCMOLT_GPON_ONU_STAT_ID_FEC_BYTES_CORRECTED:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, fec_bytes_corrected, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, fec_bytes_corrected, key);\n");
            break;
        case BCMOLT_GPON_ONU_STAT_ID_FEC_CODEWORDS_CORRECTED:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, fec_codewords_corrected, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, fec_codewords_corrected, key);\n");
            break;
        case BCMOLT_GPON_ONU_STAT_ID_FEC_CODEWORDS_UNCORRECTED:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, fec_codewords_uncorrected, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, fec_codewords_uncorrected, key);\n");
            break;
        case BCMOLT_GPON_ONU_STAT_ID_BIP8_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, bip8_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, bip8_bytes, key);\n");
            break;
        case BCMOLT_GPON_ONU_STAT_ID_BIP8_ERRORS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, bip8_errors, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, bip8_errors, key);\n");
            break;
        case BCMOLT_GPON_ONU_STAT_ID_RX_PLOAMS_CRC_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, rx_ploams_crc_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, rx_ploams_crc_error, key);\n");
            break;
        case BCMOLT_GPON_ONU_STAT_ID_RX_PLOAMS_NON_IDLE:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, rx_ploams_non_idle, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, rx_ploams_non_idle, key);\n");
            break;
        case BCMOLT_GPON_ONU_STAT_ID_POSITIVE_DRIFT:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, positive_drift, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, positive_drift, key);\n");
            break;
        case BCMOLT_GPON_ONU_STAT_ID_NEGATIVE_DRIFT:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, negative_drift, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, negative_drift, key);\n");
            break;
        case BCMOLT_GPON_ONU_STAT_ID_RX_OMCI:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, rx_omci, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, rx_omci, key);\n");
            break;
        case BCMOLT_GPON_ONU_STAT_ID_RX_OMCI_PACKETS_CRC_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, rx_omci_packets_crc_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, rx_omci_packets_crc_error, key);\n");
            break;
        case BCMOLT_GPON_ONU_STAT_ID_BER_REPORTED:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, ber_reported, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, ber_reported, key);\n");
            break;
        case BCMOLT_GPON_ONU_STAT_ID_UNRECEIVED_BURST:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, unreceived_burst, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, unreceived_burst, key);\n");
            break;
        case BCMOLT_GPON_ONU_STAT_ID_LCDG_ERRORS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, lcdg_errors, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, lcdg_errors, key);\n");
            break;
        case BCMOLT_GPON_ONU_STAT_ID_RDI_ERRORS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, rdi_errors, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, rdi_errors, key);\n");
            break;
        case BCMOLT_GPON_ONU_STAT_ID_RX_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, rx_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, rx_bytes, key);\n");
            break;
        case BCMOLT_GPON_ONU_STAT_ID_RX_PACKETS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, rx_packets, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, rx_packets, key);\n");
            break;
        case BCMOLT_GPON_ONU_STAT_ID_TX_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, tx_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, tx_bytes, key);\n");
            break;
        case BCMOLT_GPON_ONU_STAT_ID_TX_PACKETS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, tx_packets, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, tx_packets, key);\n");
            break;
        default:
            apicli_print_complete(session, BCM_ERR_RANGE, "\n");
            return BCM_ERR_RANGE;
    }

    /* call API */
    err = bcmolt_stat_cfg_get(device_id, &stat_cfg.hdr);
    bcmcli_log("bcmolt_stat_cfg_get(device_id, &stat_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &stat_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, stat_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_onu_stat_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_onu_stat_cfg stat_cfg;  /**< declare main API struct */
    bcmolt_gpon_onu_key key = { };      /**< declare key */
    bcmolt_gpon_onu_stat_id stat_id;    /**< declare stat ID */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_onu_stat_cfg stat_cfg;\n");
    bcmcli_log("bcmolt_gpon_onu_key key = {  };\n");
    apicli_print_start(session, "bcmolt_stat_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_ONU_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        key.onu_id = (bcmolt_gpon_onu_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "onu_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.onu_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_ONU_KEY_ID_ONU_ID, &key.onu_id);
    bcmcli_log(";\n");

    /* set stat ID from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "sub");
    if (cli_parm != NULL)
    {
        stat_id = (bcmolt_gpon_onu_stat_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
        return BCM_ERR_PARM;
    }

    /* init the API struct */
    switch (stat_id)
    {
        case BCMOLT_GPON_ONU_STAT_ID_FEC_CODEWORDS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, fec_codewords, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, fec_codewords, key);\n");
            break;
        case BCMOLT_GPON_ONU_STAT_ID_FEC_BYTES_CORRECTED:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, fec_bytes_corrected, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, fec_bytes_corrected, key);\n");
            break;
        case BCMOLT_GPON_ONU_STAT_ID_FEC_CODEWORDS_CORRECTED:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, fec_codewords_corrected, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, fec_codewords_corrected, key);\n");
            break;
        case BCMOLT_GPON_ONU_STAT_ID_FEC_CODEWORDS_UNCORRECTED:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, fec_codewords_uncorrected, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, fec_codewords_uncorrected, key);\n");
            break;
        case BCMOLT_GPON_ONU_STAT_ID_BIP8_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, bip8_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, bip8_bytes, key);\n");
            break;
        case BCMOLT_GPON_ONU_STAT_ID_BIP8_ERRORS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, bip8_errors, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, bip8_errors, key);\n");
            break;
        case BCMOLT_GPON_ONU_STAT_ID_RX_PLOAMS_CRC_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, rx_ploams_crc_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, rx_ploams_crc_error, key);\n");
            break;
        case BCMOLT_GPON_ONU_STAT_ID_RX_PLOAMS_NON_IDLE:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, rx_ploams_non_idle, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, rx_ploams_non_idle, key);\n");
            break;
        case BCMOLT_GPON_ONU_STAT_ID_POSITIVE_DRIFT:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, positive_drift, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, positive_drift, key);\n");
            break;
        case BCMOLT_GPON_ONU_STAT_ID_NEGATIVE_DRIFT:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, negative_drift, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, negative_drift, key);\n");
            break;
        case BCMOLT_GPON_ONU_STAT_ID_RX_OMCI:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, rx_omci, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, rx_omci, key);\n");
            break;
        case BCMOLT_GPON_ONU_STAT_ID_RX_OMCI_PACKETS_CRC_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, rx_omci_packets_crc_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, rx_omci_packets_crc_error, key);\n");
            break;
        case BCMOLT_GPON_ONU_STAT_ID_BER_REPORTED:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, ber_reported, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, ber_reported, key);\n");
            break;
        case BCMOLT_GPON_ONU_STAT_ID_UNRECEIVED_BURST:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, unreceived_burst, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, unreceived_burst, key);\n");
            break;
        case BCMOLT_GPON_ONU_STAT_ID_LCDG_ERRORS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, lcdg_errors, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, lcdg_errors, key);\n");
            break;
        case BCMOLT_GPON_ONU_STAT_ID_RDI_ERRORS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, rdi_errors, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, rdi_errors, key);\n");
            break;
        case BCMOLT_GPON_ONU_STAT_ID_RX_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, rx_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, rx_bytes, key);\n");
            break;
        case BCMOLT_GPON_ONU_STAT_ID_RX_PACKETS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, rx_packets, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, rx_packets, key);\n");
            break;
        case BCMOLT_GPON_ONU_STAT_ID_TX_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, tx_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, tx_bytes, key);\n");
            break;
        case BCMOLT_GPON_ONU_STAT_ID_TX_PACKETS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, tx_packets, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, gpon_onu, tx_packets, key);\n");
            break;
        default:
            apicli_print_complete(session, BCM_ERR_RANGE, "\n");
            return BCM_ERR_RANGE;
    }

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.");
    if (cli_parm != NULL)
    {
        bcmolt_stat_alarm_config val = { };
        cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.trigger.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.type");
            if (cli_parm != NULL)
            {
                val.trigger.type = (bcmolt_stat_condition_type) cli_parm->value.enum_val;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.type is not set\n");
                return BCM_ERR_PARM;
            }

            switch (val.trigger.type)
            {
                case BCMOLT_STAT_CONDITION_TYPE_RATE_THRESHOLD:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.rising");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_threshold.rising = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.rising is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.falling");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_threshold.falling = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.falling is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_RATE_RANGE:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.upper");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_range.upper = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.upper is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.lower");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_range.lower = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.lower is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_VALUE_THRESHOLD:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.limit");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.value_threshold.limit = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.limit is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_NONE:
                    break;
                default:
                    apicli_print_complete(session, BCM_ERR_RANGE, "\n");
                    return BCM_ERR_RANGE;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.soak.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "cfg.soak.active_soak_time");
            if (cli_parm != NULL)
            {
                val.soak.active_soak_time = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak.active_soak_time is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "cfg.soak.clear_soak_time");
            if (cli_parm != NULL)
            {
                val.soak.clear_soak_time = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak.clear_soak_time is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_STAT_CFG_PROP_SET(&stat_cfg, gpon_onu, cfg, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_stat_alarm_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_STAT_CFG, 0, BCMOLT_GPON_ONU_STAT_CFG_ID_CFG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_STAT_CFG_PROP_SET(&stat_cfg, gpon_onu, cfg, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_stat_cfg_set(device_id, &stat_cfg.hdr);
    bcmcli_log("bcmolt_stat_cfg_set(device_id, &stat_cfg.hdr);\n");
    apicli_print_complete(session, err, stat_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_onu_auto_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_onu_auto_cfg auto_cfg;  /**< declare main API struct */
    bcmolt_gpon_onu_key key = { };      /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_onu_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_gpon_onu_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_get");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, gpon_onu, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, gpon_onu, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "ber_interval_configuration_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, ber_interval_configuration_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, ber_interval_configuration_completed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "dfi");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, dfi);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, dfi);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "dgi");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, dgi);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, dgi);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "dowi");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, dowi);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, dowi);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "err");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, err);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, err);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "invalid_dbru_report");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, invalid_dbru_report);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, invalid_dbru_report);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "key_exchange_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, key_exchange_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, key_exchange_completed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "key_exchange_cycle_skipped");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, key_exchange_cycle_skipped);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, key_exchange_cycle_skipped);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "key_exchange_decrypt_required");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, key_exchange_decrypt_required);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, key_exchange_decrypt_required);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "key_exchange_key_mismatch");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, key_exchange_key_mismatch);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, key_exchange_key_mismatch);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "key_exchange_key_request_timeout");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, key_exchange_key_request_timeout);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, key_exchange_key_request_timeout);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "key_exchange_unconsecutive_index");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, key_exchange_unconsecutive_index);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, key_exchange_unconsecutive_index);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "loai");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, loai);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, loai);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "loki");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, loki);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, loki);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "memi");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, memi);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, memi);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "omci_port_id_configuration_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, omci_port_id_configuration_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, omci_port_id_configuration_completed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_activation_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, onu_activation_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, onu_activation_completed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_activation_standby_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, onu_activation_standby_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, onu_activation_standby_completed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_alarm");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, onu_alarm);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, onu_alarm);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_deactivation_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, onu_deactivation_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, onu_deactivation_completed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_disable_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, onu_disable_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, onu_disable_completed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_enable_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, onu_enable_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, onu_enable_completed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "optical_reflection");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, optical_reflection);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, optical_reflection);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "password_authentication_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, password_authentication_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, password_authentication_completed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "pee");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, pee);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, pee);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "possible_drift");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, possible_drift);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, possible_drift);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "power_management_state_change");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, power_management_state_change);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, power_management_state_change);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "pst");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, pst);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, pst);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "ranging_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, ranging_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, ranging_completed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rei");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, rei);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, rei);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rssi_measurement_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, rssi_measurement_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, rssi_measurement_completed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "sdi");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, sdi);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, sdi);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "sfi");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, sfi);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, sfi);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_cleared");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, stat_alarm_cleared);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, stat_alarm_cleared);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_raised");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, stat_alarm_raised);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, stat_alarm_raised);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "sufi");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, sufi);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, sufi);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tiwi");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, tiwi);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, tiwi);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_onu, ber_interval_configuration_completed) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_onu, dfi) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_onu, dgi) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_onu, dowi) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_onu, err) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_onu, invalid_dbru_report) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_onu, key_exchange_completed) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_onu, key_exchange_cycle_skipped) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_onu, key_exchange_decrypt_required) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_onu, key_exchange_key_mismatch) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_onu, key_exchange_key_request_timeout) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_onu, key_exchange_unconsecutive_index) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_onu, loai) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_onu, loki) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_onu, memi) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_onu, omci_port_id_configuration_completed) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_onu, onu_activation_completed) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_onu, onu_activation_standby_completed) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_onu, onu_alarm) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_onu, onu_deactivation_completed) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_onu, onu_disable_completed) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_onu, onu_enable_completed) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_onu, optical_reflection) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_onu, password_authentication_completed) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_onu, pee) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_onu, possible_drift) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_onu, power_management_state_change) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_onu, pst) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_onu, ranging_completed) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_onu, rei) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_onu, rssi_measurement_completed) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_onu, sdi) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_onu, sfi) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_onu, stat_alarm_cleared) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_onu, stat_alarm_raised) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_onu, sufi) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, gpon_onu, tiwi))
    {
        BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, all_properties);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, gpon_onu, all_properties);\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &auto_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_onu_auto_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_onu_auto_cfg auto_cfg;  /**< declare main API struct */
    bcmolt_gpon_onu_key key = { };      /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_onu_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_gpon_onu_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_set");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, gpon_onu, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, gpon_onu, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "ber_interval_configuration_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, ber_interval_configuration_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, ber_interval_configuration_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_ONU_AUTO_CFG_ID_BER_INTERVAL_CONFIGURATION_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "dfi");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, dfi, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, dfi, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_ONU_AUTO_CFG_ID_DFI, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "dgi");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, dgi, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, dgi, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_ONU_AUTO_CFG_ID_DGI, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "dowi");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, dowi, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, dowi, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_ONU_AUTO_CFG_ID_DOWI, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "err");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, err, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, err, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_ONU_AUTO_CFG_ID_ERR, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "invalid_dbru_report");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, invalid_dbru_report, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, invalid_dbru_report, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_ONU_AUTO_CFG_ID_INVALID_DBRU_REPORT, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "key_exchange_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, key_exchange_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, key_exchange_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "key_exchange_cycle_skipped");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, key_exchange_cycle_skipped, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, key_exchange_cycle_skipped, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_CYCLE_SKIPPED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "key_exchange_decrypt_required");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, key_exchange_decrypt_required, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, key_exchange_decrypt_required, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_DECRYPT_REQUIRED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "key_exchange_key_mismatch");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, key_exchange_key_mismatch, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, key_exchange_key_mismatch, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_KEY_MISMATCH, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "key_exchange_key_request_timeout");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, key_exchange_key_request_timeout, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, key_exchange_key_request_timeout, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_KEY_REQUEST_TIMEOUT, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "key_exchange_unconsecutive_index");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, key_exchange_unconsecutive_index, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, key_exchange_unconsecutive_index, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_UNCONSECUTIVE_INDEX, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "loai");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, loai, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, loai, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_ONU_AUTO_CFG_ID_LOAI, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "loki");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, loki, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, loki, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_ONU_AUTO_CFG_ID_LOKI, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "memi");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, memi, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, memi, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_ONU_AUTO_CFG_ID_MEMI, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "omci_port_id_configuration_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, omci_port_id_configuration_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, omci_port_id_configuration_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_ONU_AUTO_CFG_ID_OMCI_PORT_ID_CONFIGURATION_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_activation_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, onu_activation_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, onu_activation_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_ACTIVATION_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_activation_standby_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, onu_activation_standby_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, onu_activation_standby_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_ACTIVATION_STANDBY_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_alarm");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, onu_alarm, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, onu_alarm, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_ALARM, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_deactivation_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, onu_deactivation_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, onu_deactivation_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_DEACTIVATION_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_disable_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, onu_disable_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, onu_disable_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_DISABLE_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_enable_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, onu_enable_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, onu_enable_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_ENABLE_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "optical_reflection");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, optical_reflection, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, optical_reflection, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_ONU_AUTO_CFG_ID_OPTICAL_REFLECTION, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "password_authentication_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, password_authentication_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, password_authentication_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_ONU_AUTO_CFG_ID_PASSWORD_AUTHENTICATION_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "pee");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, pee, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, pee, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_ONU_AUTO_CFG_ID_PEE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "possible_drift");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, possible_drift, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, possible_drift, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_ONU_AUTO_CFG_ID_POSSIBLE_DRIFT, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "power_management_state_change");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, power_management_state_change, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, power_management_state_change, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_ONU_AUTO_CFG_ID_POWER_MANAGEMENT_STATE_CHANGE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "pst");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, pst, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, pst, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_ONU_AUTO_CFG_ID_PST, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "ranging_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, ranging_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, ranging_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_ONU_AUTO_CFG_ID_RANGING_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rei");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, rei, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, rei, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_ONU_AUTO_CFG_ID_REI, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rssi_measurement_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, rssi_measurement_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, rssi_measurement_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_ONU_AUTO_CFG_ID_RSSI_MEASUREMENT_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "sdi");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, sdi, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, sdi, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_ONU_AUTO_CFG_ID_SDI, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "sfi");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, sfi, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, sfi, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_ONU_AUTO_CFG_ID_SFI, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_cleared");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, stat_alarm_cleared, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, stat_alarm_cleared, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_ONU_AUTO_CFG_ID_STAT_ALARM_CLEARED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_raised");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, stat_alarm_raised, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, stat_alarm_raised, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_ONU_AUTO_CFG_ID_STAT_ALARM_RAISED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "sufi");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, sufi, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, sufi, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_ONU_AUTO_CFG_ID_SUFI, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "tiwi");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, tiwi, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, gpon_onu, tiwi, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_GPON_ONU_AUTO_CFG_ID_TIWI, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);\n");
    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_trx_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_trx_cfg cfg;        /**< declare main API struct */
    bcmolt_gpon_trx_key key = { };  /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_trx_cfg cfg;\n");
    bcmcli_log("bcmolt_gpon_trx_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_TRX_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, gpon_trx, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, gpon_trx, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "transceiver_type");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, transceiver_type);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, transceiver_type);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "la_configuration");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, la_configuration);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, la_configuration);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "bcdr");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, bcdr);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, bcdr);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "la_ranging_after_no_ed_resync");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, la_ranging_after_no_ed_resync);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, la_ranging_after_no_ed_resync);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "bcdr_ranging_after_no_ed_resync");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, bcdr_ranging_after_no_ed_resync);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, bcdr_ranging_after_no_ed_resync);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "la_ranging_after_ed_resync");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, la_ranging_after_ed_resync);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, la_ranging_after_ed_resync);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "bcdr_ranging_after_ed_resync");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, bcdr_ranging_after_ed_resync);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, bcdr_ranging_after_ed_resync);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "la_resync_polarity");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, la_resync_polarity);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, la_resync_polarity);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "bcdr_resync_polarity");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, bcdr_resync_polarity);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, bcdr_resync_polarity);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "bcdr_ranging_resync_conditions");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, bcdr_ranging_resync_conditions);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, bcdr_ranging_resync_conditions);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "la_ranging_resync_conditions");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, la_ranging_resync_conditions);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, la_ranging_resync_conditions);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_configuration");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, rx_configuration);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, rx_configuration);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "ranging_control_stages_configuration");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, ranging_control_stages_configuration);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, ranging_control_stages_configuration);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "energy_detect");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, energy_detect);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, energy_detect);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "end_of_burst_data_pattern");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, end_of_burst_data_pattern);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, end_of_burst_data_pattern);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "end_of_burst_ranging_pattern");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, end_of_burst_ranging_pattern);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, end_of_burst_ranging_pattern);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "preamble");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, preamble);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, preamble);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "delimiter");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, delimiter);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, delimiter);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "guard_bits");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, guard_bits);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, guard_bits);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "serdes_configuration");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, serdes_configuration);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, serdes_configuration);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "plo_ranging");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, plo_ranging);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, plo_ranging);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "plo_data");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, plo_data);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, plo_data);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rssi_normal_config");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, rssi_normal_config);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, rssi_normal_config);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "ranging_rssi_resync_control");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, ranging_rssi_resync_control);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, ranging_rssi_resync_control);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_trx, transceiver_type) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_trx, la_configuration) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_trx, bcdr) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_trx, la_ranging_after_no_ed_resync) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_trx, bcdr_ranging_after_no_ed_resync) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_trx, la_ranging_after_ed_resync) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_trx, bcdr_ranging_after_ed_resync) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_trx, la_resync_polarity) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_trx, bcdr_resync_polarity) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_trx, bcdr_ranging_resync_conditions) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_trx, la_ranging_resync_conditions) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_trx, rx_configuration) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_trx, ranging_control_stages_configuration) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_trx, energy_detect) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_trx, end_of_burst_data_pattern) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_trx, end_of_burst_ranging_pattern) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_trx, preamble) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_trx, delimiter) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_trx, guard_bits) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_trx, serdes_configuration) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_trx, plo_ranging) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_trx, plo_data) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_trx, rssi_normal_config) && !BCMOLT_CFG_PROP_IS_SET(&cfg, gpon_trx, ranging_rssi_resync_control))
    {
        BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, all_properties);
        bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, gpon_trx, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_get(device_id, &cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_trx_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_trx_cfg cfg;        /**< declare main API struct */
    bcmolt_gpon_trx_key key = { };  /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_trx_cfg cfg;\n");
    bcmcli_log("bcmolt_gpon_trx_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_TRX_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, gpon_trx, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, gpon_trx, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "transceiver_type");
    if (cli_parm != NULL)
    {
        bcmolt_trx_type val;
        val = (bcmolt_trx_type) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, transceiver_type, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, transceiver_type, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_TRX_CFG_ID_TRANSCEIVER_TYPE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "la_configuration.");
    if (cli_parm != NULL)
    {
        bcmolt_la_resync_pattern_configuration val = { };
        cli_parm = bcmcli_find_parm_by_prefix(session, "la_configuration.resync_control.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "la_configuration.resync_control.start_pattern");
            if (cli_parm != NULL)
            {
                val.resync_control.start_pattern = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "la_configuration.resync_control.start_pattern is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "la_configuration.resync_control.middle_pattern");
            if (cli_parm != NULL)
            {
                val.resync_control.middle_pattern = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "la_configuration.resync_control.middle_pattern is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "la_configuration.resync_control.last_pattern");
            if (cli_parm != NULL)
            {
                val.resync_control.last_pattern = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "la_configuration.resync_control.last_pattern is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "la_configuration.resync_control.middle_repetition");
            if (cli_parm != NULL)
            {
                val.resync_control.middle_repetition = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "la_configuration.resync_control.middle_repetition is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "la_configuration.resync_control.location");
            if (cli_parm != NULL)
            {
                val.resync_control.location = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "la_configuration.resync_control.location is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "la_configuration.resync_control is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "la_configuration.ranging_resync_control.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "la_configuration.ranging_resync_control.start_pattern");
            if (cli_parm != NULL)
            {
                val.ranging_resync_control.start_pattern = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "la_configuration.ranging_resync_control.start_pattern is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "la_configuration.ranging_resync_control.middle_pattern");
            if (cli_parm != NULL)
            {
                val.ranging_resync_control.middle_pattern = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "la_configuration.ranging_resync_control.middle_pattern is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "la_configuration.ranging_resync_control.last_pattern");
            if (cli_parm != NULL)
            {
                val.ranging_resync_control.last_pattern = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "la_configuration.ranging_resync_control.last_pattern is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "la_configuration.ranging_resync_control.middle_repetition");
            if (cli_parm != NULL)
            {
                val.ranging_resync_control.middle_repetition = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "la_configuration.ranging_resync_control.middle_repetition is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "la_configuration.ranging_resync_control.location");
            if (cli_parm != NULL)
            {
                val.ranging_resync_control.location = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "la_configuration.ranging_resync_control.location is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "la_configuration.ranging_resync_control is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, la_configuration, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_la_resync_pattern_configuration val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_TRX_CFG_ID_LA_CONFIGURATION, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, la_configuration, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "bcdr.");
    if (cli_parm != NULL)
    {
        bcmolt_bcdr_resync_pattern_configuration val = { };
        cli_parm = bcmcli_find_parm_by_prefix(session, "bcdr.resync_control.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "bcdr.resync_control.start_pattern");
            if (cli_parm != NULL)
            {
                val.resync_control.start_pattern = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "bcdr.resync_control.start_pattern is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "bcdr.resync_control.middle_pattern");
            if (cli_parm != NULL)
            {
                val.resync_control.middle_pattern = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "bcdr.resync_control.middle_pattern is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "bcdr.resync_control.last_pattern");
            if (cli_parm != NULL)
            {
                val.resync_control.last_pattern = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "bcdr.resync_control.last_pattern is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "bcdr.resync_control.middle_repetition");
            if (cli_parm != NULL)
            {
                val.resync_control.middle_repetition = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "bcdr.resync_control.middle_repetition is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "bcdr.resync_control.location");
            if (cli_parm != NULL)
            {
                val.resync_control.location = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "bcdr.resync_control.location is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "bcdr.resync_control is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "bcdr.ranging_resync_control.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "bcdr.ranging_resync_control.start_pattern");
            if (cli_parm != NULL)
            {
                val.ranging_resync_control.start_pattern = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "bcdr.ranging_resync_control.start_pattern is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "bcdr.ranging_resync_control.middle_pattern");
            if (cli_parm != NULL)
            {
                val.ranging_resync_control.middle_pattern = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "bcdr.ranging_resync_control.middle_pattern is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "bcdr.ranging_resync_control.last_pattern");
            if (cli_parm != NULL)
            {
                val.ranging_resync_control.last_pattern = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "bcdr.ranging_resync_control.last_pattern is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "bcdr.ranging_resync_control.middle_repetition");
            if (cli_parm != NULL)
            {
                val.ranging_resync_control.middle_repetition = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "bcdr.ranging_resync_control.middle_repetition is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "bcdr.ranging_resync_control.location");
            if (cli_parm != NULL)
            {
                val.ranging_resync_control.location = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "bcdr.ranging_resync_control.location is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "bcdr.ranging_resync_control is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, bcdr, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_bcdr_resync_pattern_configuration val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_TRX_CFG_ID_BCDR, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, bcdr, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "la_ranging_after_no_ed_resync.");
    if (cli_parm != NULL)
    {
        bcmolt_resync_control val = { };
        cli_parm = bcmcli_find_named_parm(session, "la_ranging_after_no_ed_resync.start_pattern");
        if (cli_parm != NULL)
        {
            val.start_pattern = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "la_ranging_after_no_ed_resync.start_pattern is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "la_ranging_after_no_ed_resync.middle_pattern");
        if (cli_parm != NULL)
        {
            val.middle_pattern = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "la_ranging_after_no_ed_resync.middle_pattern is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "la_ranging_after_no_ed_resync.last_pattern");
        if (cli_parm != NULL)
        {
            val.last_pattern = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "la_ranging_after_no_ed_resync.last_pattern is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "la_ranging_after_no_ed_resync.middle_repetition");
        if (cli_parm != NULL)
        {
            val.middle_repetition = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "la_ranging_after_no_ed_resync.middle_repetition is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "la_ranging_after_no_ed_resync.location");
        if (cli_parm != NULL)
        {
            val.location = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "la_ranging_after_no_ed_resync.location is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, la_ranging_after_no_ed_resync, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_resync_control val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_TRX_CFG_ID_LA_RANGING_AFTER_NO_ED_RESYNC, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, la_ranging_after_no_ed_resync, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "bcdr_ranging_after_no_ed_resync.");
    if (cli_parm != NULL)
    {
        bcmolt_resync_control val = { };
        cli_parm = bcmcli_find_named_parm(session, "bcdr_ranging_after_no_ed_resync.start_pattern");
        if (cli_parm != NULL)
        {
            val.start_pattern = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "bcdr_ranging_after_no_ed_resync.start_pattern is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "bcdr_ranging_after_no_ed_resync.middle_pattern");
        if (cli_parm != NULL)
        {
            val.middle_pattern = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "bcdr_ranging_after_no_ed_resync.middle_pattern is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "bcdr_ranging_after_no_ed_resync.last_pattern");
        if (cli_parm != NULL)
        {
            val.last_pattern = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "bcdr_ranging_after_no_ed_resync.last_pattern is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "bcdr_ranging_after_no_ed_resync.middle_repetition");
        if (cli_parm != NULL)
        {
            val.middle_repetition = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "bcdr_ranging_after_no_ed_resync.middle_repetition is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "bcdr_ranging_after_no_ed_resync.location");
        if (cli_parm != NULL)
        {
            val.location = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "bcdr_ranging_after_no_ed_resync.location is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, bcdr_ranging_after_no_ed_resync, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_resync_control val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_TRX_CFG_ID_BCDR_RANGING_AFTER_NO_ED_RESYNC, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, bcdr_ranging_after_no_ed_resync, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "la_ranging_after_ed_resync.");
    if (cli_parm != NULL)
    {
        bcmolt_resync_control val = { };
        cli_parm = bcmcli_find_named_parm(session, "la_ranging_after_ed_resync.start_pattern");
        if (cli_parm != NULL)
        {
            val.start_pattern = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "la_ranging_after_ed_resync.start_pattern is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "la_ranging_after_ed_resync.middle_pattern");
        if (cli_parm != NULL)
        {
            val.middle_pattern = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "la_ranging_after_ed_resync.middle_pattern is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "la_ranging_after_ed_resync.last_pattern");
        if (cli_parm != NULL)
        {
            val.last_pattern = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "la_ranging_after_ed_resync.last_pattern is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "la_ranging_after_ed_resync.middle_repetition");
        if (cli_parm != NULL)
        {
            val.middle_repetition = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "la_ranging_after_ed_resync.middle_repetition is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "la_ranging_after_ed_resync.location");
        if (cli_parm != NULL)
        {
            val.location = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "la_ranging_after_ed_resync.location is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, la_ranging_after_ed_resync, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_resync_control val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_TRX_CFG_ID_LA_RANGING_AFTER_ED_RESYNC, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, la_ranging_after_ed_resync, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "bcdr_ranging_after_ed_resync.");
    if (cli_parm != NULL)
    {
        bcmolt_resync_control val = { };
        cli_parm = bcmcli_find_named_parm(session, "bcdr_ranging_after_ed_resync.start_pattern");
        if (cli_parm != NULL)
        {
            val.start_pattern = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "bcdr_ranging_after_ed_resync.start_pattern is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "bcdr_ranging_after_ed_resync.middle_pattern");
        if (cli_parm != NULL)
        {
            val.middle_pattern = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "bcdr_ranging_after_ed_resync.middle_pattern is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "bcdr_ranging_after_ed_resync.last_pattern");
        if (cli_parm != NULL)
        {
            val.last_pattern = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "bcdr_ranging_after_ed_resync.last_pattern is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "bcdr_ranging_after_ed_resync.middle_repetition");
        if (cli_parm != NULL)
        {
            val.middle_repetition = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "bcdr_ranging_after_ed_resync.middle_repetition is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "bcdr_ranging_after_ed_resync.location");
        if (cli_parm != NULL)
        {
            val.location = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "bcdr_ranging_after_ed_resync.location is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, bcdr_ranging_after_ed_resync, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_resync_control val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_TRX_CFG_ID_BCDR_RANGING_AFTER_ED_RESYNC, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, bcdr_ranging_after_ed_resync, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "la_resync_polarity");
    if (cli_parm != NULL)
    {
        bcmolt_polarity val;
        val = (bcmolt_polarity) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, la_resync_polarity, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, la_resync_polarity, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_TRX_CFG_ID_LA_RESYNC_POLARITY, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "bcdr_resync_polarity");
    if (cli_parm != NULL)
    {
        bcmolt_polarity val;
        val = (bcmolt_polarity) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, bcdr_resync_polarity, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, bcdr_resync_polarity, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_TRX_CFG_ID_BCDR_RESYNC_POLARITY, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "bcdr_ranging_resync_conditions.");
    if (cli_parm != NULL)
    {
        bcmolt_ranging_resync_conditions val = { };
        cli_parm = bcmcli_find_named_parm(session, "bcdr_ranging_resync_conditions.after_init");
        if (cli_parm != NULL)
        {
            val.after_init = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "bcdr_ranging_resync_conditions.after_init is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "bcdr_ranging_resync_conditions.after_no_ed");
        if (cli_parm != NULL)
        {
            val.after_no_ed = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "bcdr_ranging_resync_conditions.after_no_ed is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "bcdr_ranging_resync_conditions.after_ed");
        if (cli_parm != NULL)
        {
            val.after_ed = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "bcdr_ranging_resync_conditions.after_ed is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "bcdr_ranging_resync_conditions.after_no_del");
        if (cli_parm != NULL)
        {
            val.after_no_del = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "bcdr_ranging_resync_conditions.after_no_del is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "bcdr_ranging_resync_conditions.after_ranging_access");
        if (cli_parm != NULL)
        {
            val.after_ranging_access = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "bcdr_ranging_resync_conditions.after_ranging_access is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "bcdr_ranging_resync_conditions.med_val");
        if (cli_parm != NULL)
        {
            val.med_val = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "bcdr_ranging_resync_conditions.med_val is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, bcdr_ranging_resync_conditions, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_ranging_resync_conditions val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_TRX_CFG_ID_BCDR_RANGING_RESYNC_CONDITIONS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, bcdr_ranging_resync_conditions, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "la_ranging_resync_conditions.");
    if (cli_parm != NULL)
    {
        bcmolt_ranging_resync_conditions val = { };
        cli_parm = bcmcli_find_named_parm(session, "la_ranging_resync_conditions.after_init");
        if (cli_parm != NULL)
        {
            val.after_init = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "la_ranging_resync_conditions.after_init is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "la_ranging_resync_conditions.after_no_ed");
        if (cli_parm != NULL)
        {
            val.after_no_ed = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "la_ranging_resync_conditions.after_no_ed is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "la_ranging_resync_conditions.after_ed");
        if (cli_parm != NULL)
        {
            val.after_ed = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "la_ranging_resync_conditions.after_ed is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "la_ranging_resync_conditions.after_no_del");
        if (cli_parm != NULL)
        {
            val.after_no_del = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "la_ranging_resync_conditions.after_no_del is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "la_ranging_resync_conditions.after_ranging_access");
        if (cli_parm != NULL)
        {
            val.after_ranging_access = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "la_ranging_resync_conditions.after_ranging_access is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "la_ranging_resync_conditions.med_val");
        if (cli_parm != NULL)
        {
            val.med_val = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "la_ranging_resync_conditions.med_val is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, la_ranging_resync_conditions, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_ranging_resync_conditions val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_TRX_CFG_ID_LA_RANGING_RESYNC_CONDITIONS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, la_ranging_resync_conditions, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "rx_configuration.");
    if (cli_parm != NULL)
    {
        bcmolt_trx_rx_configuration val = { };
        cli_parm = bcmcli_find_named_parm(session, "rx_configuration.wait_window_size");
        if (cli_parm != NULL)
        {
            val.wait_window_size = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "rx_configuration.wait_window_size is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "rx_configuration.ranging_access_window_size");
        if (cli_parm != NULL)
        {
            val.ranging_access_window_size = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "rx_configuration.ranging_access_window_size is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, rx_configuration, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_trx_rx_configuration val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_TRX_CFG_ID_RX_CONFIGURATION, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, rx_configuration, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "ranging_control_stages_configuration.");
    if (cli_parm != NULL)
    {
        bcmolt_ranging_control_configuration val = { };
        cli_parm = bcmcli_find_named_parm(session, "ranging_control_stages_configuration.wait_state_1_window_size");
        if (cli_parm != NULL)
        {
            val.wait_state_1_window_size = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ranging_control_stages_configuration.wait_state_1_window_size is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "ranging_control_stages_configuration.wait_state_2_window_size");
        if (cli_parm != NULL)
        {
            val.wait_state_2_window_size = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ranging_control_stages_configuration.wait_state_2_window_size is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "ranging_control_stages_configuration.wait_after_resync_4");
        if (cli_parm != NULL)
        {
            val.wait_after_resync_4 = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ranging_control_stages_configuration.wait_after_resync_4 is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, ranging_control_stages_configuration, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_ranging_control_configuration val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_TRX_CFG_ID_RANGING_CONTROL_STAGES_CONFIGURATION, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, ranging_control_stages_configuration, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "energy_detect.");
    if (cli_parm != NULL)
    {
        bcmolt_trx_energy_detect val = { };
        cli_parm = bcmcli_find_named_parm(session, "energy_detect.ranging_ed_source");
        if (cli_parm != NULL)
        {
            val.ranging_ed_source = (bcmolt_energy_detect_source) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "energy_detect.ranging_ed_source is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "energy_detect.delimiter_ed_source");
        if (cli_parm != NULL)
        {
            val.delimiter_ed_source = (bcmolt_energy_detect_source) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "energy_detect.delimiter_ed_source is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "energy_detect.minimum_threshold");
        if (cli_parm != NULL)
        {
            val.minimum_threshold = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "energy_detect.minimum_threshold is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "energy_detect.maximum_threshold");
        if (cli_parm != NULL)
        {
            val.maximum_threshold = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "energy_detect.maximum_threshold is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "energy_detect.ed_pattern");
        if (cli_parm != NULL)
        {
            val.ed_pattern = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "energy_detect.ed_pattern is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "energy_detect.ed_pattern_size");
        if (cli_parm != NULL)
        {
            val.ed_pattern_size = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "energy_detect.ed_pattern_size is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "energy_detect.window_size");
        if (cli_parm != NULL)
        {
            val.window_size = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "energy_detect.window_size is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "energy_detect.inversion");
        if (cli_parm != NULL)
        {
            val.inversion = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "energy_detect.inversion is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "energy_detect.no_ed_threshold");
        if (cli_parm != NULL)
        {
            val.no_ed_threshold = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "energy_detect.no_ed_threshold is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, energy_detect, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_trx_energy_detect val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_TRX_CFG_ID_ENERGY_DETECT, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, energy_detect, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "end_of_burst_data_pattern.");
    if (cli_parm != NULL)
    {
        bcmolt_resync_control val = { };
        cli_parm = bcmcli_find_named_parm(session, "end_of_burst_data_pattern.start_pattern");
        if (cli_parm != NULL)
        {
            val.start_pattern = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "end_of_burst_data_pattern.start_pattern is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "end_of_burst_data_pattern.middle_pattern");
        if (cli_parm != NULL)
        {
            val.middle_pattern = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "end_of_burst_data_pattern.middle_pattern is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "end_of_burst_data_pattern.last_pattern");
        if (cli_parm != NULL)
        {
            val.last_pattern = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "end_of_burst_data_pattern.last_pattern is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "end_of_burst_data_pattern.middle_repetition");
        if (cli_parm != NULL)
        {
            val.middle_repetition = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "end_of_burst_data_pattern.middle_repetition is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "end_of_burst_data_pattern.location");
        if (cli_parm != NULL)
        {
            val.location = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "end_of_burst_data_pattern.location is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, end_of_burst_data_pattern, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_resync_control val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_TRX_CFG_ID_END_OF_BURST_DATA_PATTERN, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, end_of_burst_data_pattern, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "end_of_burst_ranging_pattern.");
    if (cli_parm != NULL)
    {
        bcmolt_resync_control val = { };
        cli_parm = bcmcli_find_named_parm(session, "end_of_burst_ranging_pattern.start_pattern");
        if (cli_parm != NULL)
        {
            val.start_pattern = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "end_of_burst_ranging_pattern.start_pattern is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "end_of_burst_ranging_pattern.middle_pattern");
        if (cli_parm != NULL)
        {
            val.middle_pattern = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "end_of_burst_ranging_pattern.middle_pattern is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "end_of_burst_ranging_pattern.last_pattern");
        if (cli_parm != NULL)
        {
            val.last_pattern = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "end_of_burst_ranging_pattern.last_pattern is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "end_of_burst_ranging_pattern.middle_repetition");
        if (cli_parm != NULL)
        {
            val.middle_repetition = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "end_of_burst_ranging_pattern.middle_repetition is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "end_of_burst_ranging_pattern.location");
        if (cli_parm != NULL)
        {
            val.location = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "end_of_burst_ranging_pattern.location is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, end_of_burst_ranging_pattern, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_resync_control val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_TRX_CFG_ID_END_OF_BURST_RANGING_PATTERN, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, end_of_burst_ranging_pattern, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "preamble.");
    if (cli_parm != NULL)
    {
        bcmolt_trx_preamble val = { };
        cli_parm = bcmcli_find_named_parm(session, "preamble.type_1_size");
        if (cli_parm != NULL)
        {
            val.type_1_size = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "preamble.type_1_size is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "preamble.type_2_size");
        if (cli_parm != NULL)
        {
            val.type_2_size = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "preamble.type_2_size is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "preamble.type_3_pre_ranging_size");
        if (cli_parm != NULL)
        {
            val.type_3_pre_ranging_size = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "preamble.type_3_pre_ranging_size is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "preamble.type_3_post_ranging_size");
        if (cli_parm != NULL)
        {
            val.type_3_post_ranging_size = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "preamble.type_3_post_ranging_size is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "preamble.type_3_pattern");
        if (cli_parm != NULL)
        {
            val.type_3_pattern = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "preamble.type_3_pattern is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, preamble, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_trx_preamble val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_TRX_CFG_ID_PREAMBLE, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, preamble, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "delimiter.");
    if (cli_parm != NULL)
    {
        bcmolt_trx_delimiter val = { };
        cli_parm = bcmcli_find_named_parm(session, "delimiter.pattern");
        if (cli_parm != NULL)
        {
            if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 3)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "buffer delimiter.pattern must have 3 bytes\n");
                return BCM_ERR_PARM;
            }

            bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
            bcmolt_buf_read(&cli_parm->value.buffer, val.pattern, 3);
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "delimiter.pattern is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "delimiter.size");
        if (cli_parm != NULL)
        {
            val.size = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "delimiter.size is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "delimiter.window_size");
        if (cli_parm != NULL)
        {
            val.window_size = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "delimiter.window_size is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, delimiter, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_trx_delimiter val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_TRX_CFG_ID_DELIMITER, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, delimiter, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "guard_bits");
    if (cli_parm != NULL)
    {
        uint32_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, guard_bits, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, guard_bits, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_TRX_CFG_ID_GUARD_BITS, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "serdes_configuration.");
    if (cli_parm != NULL)
    {
        bcmolt_serdes_configuration val = { };
        cli_parm = bcmcli_find_named_parm(session, "serdes_configuration.ranging_mode");
        if (cli_parm != NULL)
        {
            val.ranging_mode = (bcmolt_serdes_ranging_mode) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "serdes_configuration.ranging_mode is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "serdes_configuration.multi_ed_mode");
        if (cli_parm != NULL)
        {
            val.multi_ed_mode = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "serdes_configuration.multi_ed_mode is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "serdes_configuration.burst_enable_start_offset");
        if (cli_parm != NULL)
        {
            val.burst_enable_start_offset = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "serdes_configuration.burst_enable_start_offset is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "serdes_configuration.burst_enable_end_offset");
        if (cli_parm != NULL)
        {
            val.burst_enable_end_offset = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "serdes_configuration.burst_enable_end_offset is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "serdes_configuration.ed_invertion");
        if (cli_parm != NULL)
        {
            val.ed_invertion = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "serdes_configuration.ed_invertion is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, serdes_configuration, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_serdes_configuration val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_TRX_CFG_ID_SERDES_CONFIGURATION, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, serdes_configuration, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "rssi_normal_config.");
    if (cli_parm != NULL)
    {
        bcmolt_gpon_rssi_general_configuration val = { };
        cli_parm = bcmcli_find_named_parm(session, "rssi_normal_config.location");
        if (cli_parm != NULL)
        {
            val.location = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "rssi_normal_config.location is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "rssi_normal_config.location_sign");
        if (cli_parm != NULL)
        {
            val.location_sign = (bcmolt_rssi_location_sign) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "rssi_normal_config.location_sign is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "rssi_normal_config.start_pattern");
        if (cli_parm != NULL)
        {
            val.start_pattern = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "rssi_normal_config.start_pattern is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "rssi_normal_config.middle_pattern");
        if (cli_parm != NULL)
        {
            val.middle_pattern = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "rssi_normal_config.middle_pattern is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "rssi_normal_config.last_pattern");
        if (cli_parm != NULL)
        {
            val.last_pattern = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "rssi_normal_config.last_pattern is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "rssi_normal_config.middle_repertition");
        if (cli_parm != NULL)
        {
            val.middle_repertition = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "rssi_normal_config.middle_repertition is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "rssi_normal_config.minimum_burst");
        if (cli_parm != NULL)
        {
            val.minimum_burst = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "rssi_normal_config.minimum_burst is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, rssi_normal_config, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_gpon_rssi_general_configuration val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_TRX_CFG_ID_RSSI_NORMAL_CONFIG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, rssi_normal_config, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "ranging_rssi_resync_control.");
    if (cli_parm != NULL)
    {
        bcmolt_ranging_rssi_control val = { };
        cli_parm = bcmcli_find_named_parm(session, "ranging_rssi_resync_control.after_no_ed");
        if (cli_parm != NULL)
        {
            val.after_no_ed = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ranging_rssi_resync_control.after_no_ed is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "ranging_rssi_resync_control.after_ed");
        if (cli_parm != NULL)
        {
            val.after_ed = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ranging_rssi_resync_control.after_ed is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "ranging_rssi_resync_control.after_reset_3");
        if (cli_parm != NULL)
        {
            val.after_reset_3 = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ranging_rssi_resync_control.after_reset_3 is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, ranging_rssi_resync_control, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_ranging_rssi_control val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_TRX_CFG_ID_RANGING_RSSI_RESYNC_CONTROL, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, ranging_rssi_resync_control, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_cfg_set(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_set(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_trx_cfg_clear(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_trx_cfg cfg;        /**< declare main API struct */
    bcmolt_gpon_trx_key key = { };  /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_trx_cfg cfg;\n");
    bcmcli_log("bcmolt_gpon_trx_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_clear");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_TRX_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, gpon_trx, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, gpon_trx, key);\n");

    /* call API */
    err = bcmolt_cfg_clear(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_clear(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_gpon_trx_cfg_get_multi(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_gpon_trx_cfg cfg;        /**< declare main API struct */
    bcmolt_gpon_trx_key key = { };  /**< declare key */
    bcmolt_msg_set *msg_set = NULL; /**< declare message set */
    uint32_t max_msgs;              /**< declare max number of msgs to get */
    bcmos_bool invert_filter;       /**< declare filter invert flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_gpon_trx_cfg cfg;\n");
    bcmcli_log("bcmolt_gpon_trx_key key = {  };\n");
    bcmcli_log("bcmolt_msg_set* msg_set = NULL;\n");
    bcmcli_log("uint32_t max_msgs;\n");
    bcmcli_log("bcmos_bool invert_filter;\n");
    apicli_print_start(session, "bcmolt_cfg_get_multi");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_gpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_GPON_TRX_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* set max number of msgs from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "max_msgs");
    if (cli_parm != NULL)
    {
        max_msgs = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "max_msgs is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("max_msgs = %d;\n", max_msgs);

    /* set filter invert flag from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "filter_invert");
    if (cli_parm != NULL)
    {
        invert_filter = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "filter_invert is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("invert_filter = %s;\n", (invert_filter) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* allocate message set */
    err = apicli_msg_set_alloc(byte_pool, BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);
    if (err != BCM_ERR_OK)
    {
        return err;
    }

    bcmcli_log("bcmolt_msg_set_alloc(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, gpon_trx, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, gpon_trx, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "filter.transceiver_type");
    if (cli_parm != NULL)
    {
        bcmolt_trx_type val;
        val = (bcmolt_trx_type) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, transceiver_type, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, transceiver_type, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_TRX_CFG_ID_TRANSCEIVER_TYPE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "transceiver_type");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, transceiver_type);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, transceiver_type);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.la_configuration.");
    if (cli_parm != NULL)
    {
        bcmolt_la_resync_pattern_configuration val = { };
        cli_parm = bcmcli_find_parm_by_prefix(session, "filter.la_configuration.resync_control.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "filter.la_configuration.resync_control.start_pattern");
            if (cli_parm != NULL)
            {
                val.resync_control.start_pattern = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.la_configuration.resync_control.start_pattern is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.la_configuration.resync_control.middle_pattern");
            if (cli_parm != NULL)
            {
                val.resync_control.middle_pattern = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.la_configuration.resync_control.middle_pattern is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.la_configuration.resync_control.last_pattern");
            if (cli_parm != NULL)
            {
                val.resync_control.last_pattern = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.la_configuration.resync_control.last_pattern is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.la_configuration.resync_control.middle_repetition");
            if (cli_parm != NULL)
            {
                val.resync_control.middle_repetition = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.la_configuration.resync_control.middle_repetition is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.la_configuration.resync_control.location");
            if (cli_parm != NULL)
            {
                val.resync_control.location = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.la_configuration.resync_control.location is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.la_configuration.resync_control is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "filter.la_configuration.ranging_resync_control.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "filter.la_configuration.ranging_resync_control.start_pattern");
            if (cli_parm != NULL)
            {
                val.ranging_resync_control.start_pattern = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.la_configuration.ranging_resync_control.start_pattern is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.la_configuration.ranging_resync_control.middle_pattern");
            if (cli_parm != NULL)
            {
                val.ranging_resync_control.middle_pattern = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.la_configuration.ranging_resync_control.middle_pattern is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.la_configuration.ranging_resync_control.last_pattern");
            if (cli_parm != NULL)
            {
                val.ranging_resync_control.last_pattern = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.la_configuration.ranging_resync_control.last_pattern is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.la_configuration.ranging_resync_control.middle_repetition");
            if (cli_parm != NULL)
            {
                val.ranging_resync_control.middle_repetition = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.la_configuration.ranging_resync_control.middle_repetition is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.la_configuration.ranging_resync_control.location");
            if (cli_parm != NULL)
            {
                val.ranging_resync_control.location = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.la_configuration.ranging_resync_control.location is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.la_configuration.ranging_resync_control is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, la_configuration, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_la_resync_pattern_configuration val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_TRX_CFG_ID_LA_CONFIGURATION, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, la_configuration, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "la_configuration");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, la_configuration);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, la_configuration);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.bcdr.");
    if (cli_parm != NULL)
    {
        bcmolt_bcdr_resync_pattern_configuration val = { };
        cli_parm = bcmcli_find_parm_by_prefix(session, "filter.bcdr.resync_control.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "filter.bcdr.resync_control.start_pattern");
            if (cli_parm != NULL)
            {
                val.resync_control.start_pattern = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.bcdr.resync_control.start_pattern is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.bcdr.resync_control.middle_pattern");
            if (cli_parm != NULL)
            {
                val.resync_control.middle_pattern = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.bcdr.resync_control.middle_pattern is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.bcdr.resync_control.last_pattern");
            if (cli_parm != NULL)
            {
                val.resync_control.last_pattern = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.bcdr.resync_control.last_pattern is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.bcdr.resync_control.middle_repetition");
            if (cli_parm != NULL)
            {
                val.resync_control.middle_repetition = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.bcdr.resync_control.middle_repetition is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.bcdr.resync_control.location");
            if (cli_parm != NULL)
            {
                val.resync_control.location = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.bcdr.resync_control.location is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.bcdr.resync_control is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "filter.bcdr.ranging_resync_control.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "filter.bcdr.ranging_resync_control.start_pattern");
            if (cli_parm != NULL)
            {
                val.ranging_resync_control.start_pattern = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.bcdr.ranging_resync_control.start_pattern is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.bcdr.ranging_resync_control.middle_pattern");
            if (cli_parm != NULL)
            {
                val.ranging_resync_control.middle_pattern = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.bcdr.ranging_resync_control.middle_pattern is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.bcdr.ranging_resync_control.last_pattern");
            if (cli_parm != NULL)
            {
                val.ranging_resync_control.last_pattern = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.bcdr.ranging_resync_control.last_pattern is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.bcdr.ranging_resync_control.middle_repetition");
            if (cli_parm != NULL)
            {
                val.ranging_resync_control.middle_repetition = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.bcdr.ranging_resync_control.middle_repetition is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.bcdr.ranging_resync_control.location");
            if (cli_parm != NULL)
            {
                val.ranging_resync_control.location = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.bcdr.ranging_resync_control.location is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.bcdr.ranging_resync_control is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, bcdr, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_bcdr_resync_pattern_configuration val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_TRX_CFG_ID_BCDR, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, bcdr, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "bcdr");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, bcdr);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, bcdr);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.la_ranging_after_no_ed_resync.");
    if (cli_parm != NULL)
    {
        bcmolt_resync_control val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.la_ranging_after_no_ed_resync.start_pattern");
        if (cli_parm != NULL)
        {
            val.start_pattern = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.la_ranging_after_no_ed_resync.start_pattern is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.la_ranging_after_no_ed_resync.middle_pattern");
        if (cli_parm != NULL)
        {
            val.middle_pattern = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.la_ranging_after_no_ed_resync.middle_pattern is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.la_ranging_after_no_ed_resync.last_pattern");
        if (cli_parm != NULL)
        {
            val.last_pattern = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.la_ranging_after_no_ed_resync.last_pattern is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.la_ranging_after_no_ed_resync.middle_repetition");
        if (cli_parm != NULL)
        {
            val.middle_repetition = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.la_ranging_after_no_ed_resync.middle_repetition is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.la_ranging_after_no_ed_resync.location");
        if (cli_parm != NULL)
        {
            val.location = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.la_ranging_after_no_ed_resync.location is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, la_ranging_after_no_ed_resync, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_resync_control val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_TRX_CFG_ID_LA_RANGING_AFTER_NO_ED_RESYNC, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, la_ranging_after_no_ed_resync, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "la_ranging_after_no_ed_resync");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, la_ranging_after_no_ed_resync);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, la_ranging_after_no_ed_resync);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.bcdr_ranging_after_no_ed_resync.");
    if (cli_parm != NULL)
    {
        bcmolt_resync_control val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.bcdr_ranging_after_no_ed_resync.start_pattern");
        if (cli_parm != NULL)
        {
            val.start_pattern = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.bcdr_ranging_after_no_ed_resync.start_pattern is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.bcdr_ranging_after_no_ed_resync.middle_pattern");
        if (cli_parm != NULL)
        {
            val.middle_pattern = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.bcdr_ranging_after_no_ed_resync.middle_pattern is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.bcdr_ranging_after_no_ed_resync.last_pattern");
        if (cli_parm != NULL)
        {
            val.last_pattern = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.bcdr_ranging_after_no_ed_resync.last_pattern is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.bcdr_ranging_after_no_ed_resync.middle_repetition");
        if (cli_parm != NULL)
        {
            val.middle_repetition = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.bcdr_ranging_after_no_ed_resync.middle_repetition is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.bcdr_ranging_after_no_ed_resync.location");
        if (cli_parm != NULL)
        {
            val.location = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.bcdr_ranging_after_no_ed_resync.location is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, bcdr_ranging_after_no_ed_resync, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_resync_control val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_TRX_CFG_ID_BCDR_RANGING_AFTER_NO_ED_RESYNC, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, bcdr_ranging_after_no_ed_resync, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "bcdr_ranging_after_no_ed_resync");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, bcdr_ranging_after_no_ed_resync);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, bcdr_ranging_after_no_ed_resync);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.la_ranging_after_ed_resync.");
    if (cli_parm != NULL)
    {
        bcmolt_resync_control val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.la_ranging_after_ed_resync.start_pattern");
        if (cli_parm != NULL)
        {
            val.start_pattern = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.la_ranging_after_ed_resync.start_pattern is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.la_ranging_after_ed_resync.middle_pattern");
        if (cli_parm != NULL)
        {
            val.middle_pattern = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.la_ranging_after_ed_resync.middle_pattern is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.la_ranging_after_ed_resync.last_pattern");
        if (cli_parm != NULL)
        {
            val.last_pattern = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.la_ranging_after_ed_resync.last_pattern is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.la_ranging_after_ed_resync.middle_repetition");
        if (cli_parm != NULL)
        {
            val.middle_repetition = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.la_ranging_after_ed_resync.middle_repetition is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.la_ranging_after_ed_resync.location");
        if (cli_parm != NULL)
        {
            val.location = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.la_ranging_after_ed_resync.location is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, la_ranging_after_ed_resync, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_resync_control val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_TRX_CFG_ID_LA_RANGING_AFTER_ED_RESYNC, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, la_ranging_after_ed_resync, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "la_ranging_after_ed_resync");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, la_ranging_after_ed_resync);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, la_ranging_after_ed_resync);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.bcdr_ranging_after_ed_resync.");
    if (cli_parm != NULL)
    {
        bcmolt_resync_control val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.bcdr_ranging_after_ed_resync.start_pattern");
        if (cli_parm != NULL)
        {
            val.start_pattern = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.bcdr_ranging_after_ed_resync.start_pattern is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.bcdr_ranging_after_ed_resync.middle_pattern");
        if (cli_parm != NULL)
        {
            val.middle_pattern = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.bcdr_ranging_after_ed_resync.middle_pattern is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.bcdr_ranging_after_ed_resync.last_pattern");
        if (cli_parm != NULL)
        {
            val.last_pattern = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.bcdr_ranging_after_ed_resync.last_pattern is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.bcdr_ranging_after_ed_resync.middle_repetition");
        if (cli_parm != NULL)
        {
            val.middle_repetition = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.bcdr_ranging_after_ed_resync.middle_repetition is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.bcdr_ranging_after_ed_resync.location");
        if (cli_parm != NULL)
        {
            val.location = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.bcdr_ranging_after_ed_resync.location is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, bcdr_ranging_after_ed_resync, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_resync_control val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_TRX_CFG_ID_BCDR_RANGING_AFTER_ED_RESYNC, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, bcdr_ranging_after_ed_resync, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "bcdr_ranging_after_ed_resync");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, bcdr_ranging_after_ed_resync);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, bcdr_ranging_after_ed_resync);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.la_resync_polarity");
    if (cli_parm != NULL)
    {
        bcmolt_polarity val;
        val = (bcmolt_polarity) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, la_resync_polarity, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, la_resync_polarity, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_TRX_CFG_ID_LA_RESYNC_POLARITY, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "la_resync_polarity");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, la_resync_polarity);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, la_resync_polarity);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.bcdr_resync_polarity");
    if (cli_parm != NULL)
    {
        bcmolt_polarity val;
        val = (bcmolt_polarity) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, bcdr_resync_polarity, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, bcdr_resync_polarity, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_TRX_CFG_ID_BCDR_RESYNC_POLARITY, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "bcdr_resync_polarity");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, bcdr_resync_polarity);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, bcdr_resync_polarity);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.bcdr_ranging_resync_conditions.");
    if (cli_parm != NULL)
    {
        bcmolt_ranging_resync_conditions val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.bcdr_ranging_resync_conditions.after_init");
        if (cli_parm != NULL)
        {
            val.after_init = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.bcdr_ranging_resync_conditions.after_init is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.bcdr_ranging_resync_conditions.after_no_ed");
        if (cli_parm != NULL)
        {
            val.after_no_ed = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.bcdr_ranging_resync_conditions.after_no_ed is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.bcdr_ranging_resync_conditions.after_ed");
        if (cli_parm != NULL)
        {
            val.after_ed = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.bcdr_ranging_resync_conditions.after_ed is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.bcdr_ranging_resync_conditions.after_no_del");
        if (cli_parm != NULL)
        {
            val.after_no_del = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.bcdr_ranging_resync_conditions.after_no_del is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.bcdr_ranging_resync_conditions.after_ranging_access");
        if (cli_parm != NULL)
        {
            val.after_ranging_access = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.bcdr_ranging_resync_conditions.after_ranging_access is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.bcdr_ranging_resync_conditions.med_val");
        if (cli_parm != NULL)
        {
            val.med_val = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.bcdr_ranging_resync_conditions.med_val is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, bcdr_ranging_resync_conditions, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_ranging_resync_conditions val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_TRX_CFG_ID_BCDR_RANGING_RESYNC_CONDITIONS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, bcdr_ranging_resync_conditions, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "bcdr_ranging_resync_conditions");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, bcdr_ranging_resync_conditions);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, bcdr_ranging_resync_conditions);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.la_ranging_resync_conditions.");
    if (cli_parm != NULL)
    {
        bcmolt_ranging_resync_conditions val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.la_ranging_resync_conditions.after_init");
        if (cli_parm != NULL)
        {
            val.after_init = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.la_ranging_resync_conditions.after_init is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.la_ranging_resync_conditions.after_no_ed");
        if (cli_parm != NULL)
        {
            val.after_no_ed = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.la_ranging_resync_conditions.after_no_ed is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.la_ranging_resync_conditions.after_ed");
        if (cli_parm != NULL)
        {
            val.after_ed = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.la_ranging_resync_conditions.after_ed is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.la_ranging_resync_conditions.after_no_del");
        if (cli_parm != NULL)
        {
            val.after_no_del = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.la_ranging_resync_conditions.after_no_del is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.la_ranging_resync_conditions.after_ranging_access");
        if (cli_parm != NULL)
        {
            val.after_ranging_access = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.la_ranging_resync_conditions.after_ranging_access is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.la_ranging_resync_conditions.med_val");
        if (cli_parm != NULL)
        {
            val.med_val = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.la_ranging_resync_conditions.med_val is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, la_ranging_resync_conditions, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_ranging_resync_conditions val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_TRX_CFG_ID_LA_RANGING_RESYNC_CONDITIONS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, la_ranging_resync_conditions, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "la_ranging_resync_conditions");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, la_ranging_resync_conditions);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, la_ranging_resync_conditions);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.rx_configuration.");
    if (cli_parm != NULL)
    {
        bcmolt_trx_rx_configuration val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.rx_configuration.wait_window_size");
        if (cli_parm != NULL)
        {
            val.wait_window_size = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.rx_configuration.wait_window_size is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.rx_configuration.ranging_access_window_size");
        if (cli_parm != NULL)
        {
            val.ranging_access_window_size = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.rx_configuration.ranging_access_window_size is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, rx_configuration, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_trx_rx_configuration val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_TRX_CFG_ID_RX_CONFIGURATION, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, rx_configuration, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_configuration");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, rx_configuration);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, rx_configuration);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.ranging_control_stages_configuration.");
    if (cli_parm != NULL)
    {
        bcmolt_ranging_control_configuration val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.ranging_control_stages_configuration.wait_state_1_window_size");
        if (cli_parm != NULL)
        {
            val.wait_state_1_window_size = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ranging_control_stages_configuration.wait_state_1_window_size is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.ranging_control_stages_configuration.wait_state_2_window_size");
        if (cli_parm != NULL)
        {
            val.wait_state_2_window_size = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ranging_control_stages_configuration.wait_state_2_window_size is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.ranging_control_stages_configuration.wait_after_resync_4");
        if (cli_parm != NULL)
        {
            val.wait_after_resync_4 = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ranging_control_stages_configuration.wait_after_resync_4 is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, ranging_control_stages_configuration, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_ranging_control_configuration val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_TRX_CFG_ID_RANGING_CONTROL_STAGES_CONFIGURATION, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, ranging_control_stages_configuration, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "ranging_control_stages_configuration");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, ranging_control_stages_configuration);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, ranging_control_stages_configuration);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.energy_detect.");
    if (cli_parm != NULL)
    {
        bcmolt_trx_energy_detect val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.energy_detect.ranging_ed_source");
        if (cli_parm != NULL)
        {
            val.ranging_ed_source = (bcmolt_energy_detect_source) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.energy_detect.ranging_ed_source is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.energy_detect.delimiter_ed_source");
        if (cli_parm != NULL)
        {
            val.delimiter_ed_source = (bcmolt_energy_detect_source) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.energy_detect.delimiter_ed_source is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.energy_detect.minimum_threshold");
        if (cli_parm != NULL)
        {
            val.minimum_threshold = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.energy_detect.minimum_threshold is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.energy_detect.maximum_threshold");
        if (cli_parm != NULL)
        {
            val.maximum_threshold = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.energy_detect.maximum_threshold is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.energy_detect.ed_pattern");
        if (cli_parm != NULL)
        {
            val.ed_pattern = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.energy_detect.ed_pattern is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.energy_detect.ed_pattern_size");
        if (cli_parm != NULL)
        {
            val.ed_pattern_size = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.energy_detect.ed_pattern_size is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.energy_detect.window_size");
        if (cli_parm != NULL)
        {
            val.window_size = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.energy_detect.window_size is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.energy_detect.inversion");
        if (cli_parm != NULL)
        {
            val.inversion = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.energy_detect.inversion is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.energy_detect.no_ed_threshold");
        if (cli_parm != NULL)
        {
            val.no_ed_threshold = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.energy_detect.no_ed_threshold is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, energy_detect, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_trx_energy_detect val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_TRX_CFG_ID_ENERGY_DETECT, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, energy_detect, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "energy_detect");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, energy_detect);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, energy_detect);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.end_of_burst_data_pattern.");
    if (cli_parm != NULL)
    {
        bcmolt_resync_control val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.end_of_burst_data_pattern.start_pattern");
        if (cli_parm != NULL)
        {
            val.start_pattern = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.end_of_burst_data_pattern.start_pattern is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.end_of_burst_data_pattern.middle_pattern");
        if (cli_parm != NULL)
        {
            val.middle_pattern = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.end_of_burst_data_pattern.middle_pattern is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.end_of_burst_data_pattern.last_pattern");
        if (cli_parm != NULL)
        {
            val.last_pattern = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.end_of_burst_data_pattern.last_pattern is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.end_of_burst_data_pattern.middle_repetition");
        if (cli_parm != NULL)
        {
            val.middle_repetition = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.end_of_burst_data_pattern.middle_repetition is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.end_of_burst_data_pattern.location");
        if (cli_parm != NULL)
        {
            val.location = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.end_of_burst_data_pattern.location is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, end_of_burst_data_pattern, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_resync_control val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_TRX_CFG_ID_END_OF_BURST_DATA_PATTERN, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, end_of_burst_data_pattern, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "end_of_burst_data_pattern");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, end_of_burst_data_pattern);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, end_of_burst_data_pattern);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.end_of_burst_ranging_pattern.");
    if (cli_parm != NULL)
    {
        bcmolt_resync_control val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.end_of_burst_ranging_pattern.start_pattern");
        if (cli_parm != NULL)
        {
            val.start_pattern = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.end_of_burst_ranging_pattern.start_pattern is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.end_of_burst_ranging_pattern.middle_pattern");
        if (cli_parm != NULL)
        {
            val.middle_pattern = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.end_of_burst_ranging_pattern.middle_pattern is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.end_of_burst_ranging_pattern.last_pattern");
        if (cli_parm != NULL)
        {
            val.last_pattern = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.end_of_burst_ranging_pattern.last_pattern is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.end_of_burst_ranging_pattern.middle_repetition");
        if (cli_parm != NULL)
        {
            val.middle_repetition = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.end_of_burst_ranging_pattern.middle_repetition is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.end_of_burst_ranging_pattern.location");
        if (cli_parm != NULL)
        {
            val.location = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.end_of_burst_ranging_pattern.location is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, end_of_burst_ranging_pattern, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_resync_control val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_TRX_CFG_ID_END_OF_BURST_RANGING_PATTERN, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, end_of_burst_ranging_pattern, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "end_of_burst_ranging_pattern");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, end_of_burst_ranging_pattern);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, end_of_burst_ranging_pattern);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.preamble.");
    if (cli_parm != NULL)
    {
        bcmolt_trx_preamble val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.preamble.type_1_size");
        if (cli_parm != NULL)
        {
            val.type_1_size = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.preamble.type_1_size is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.preamble.type_2_size");
        if (cli_parm != NULL)
        {
            val.type_2_size = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.preamble.type_2_size is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.preamble.type_3_pre_ranging_size");
        if (cli_parm != NULL)
        {
            val.type_3_pre_ranging_size = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.preamble.type_3_pre_ranging_size is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.preamble.type_3_post_ranging_size");
        if (cli_parm != NULL)
        {
            val.type_3_post_ranging_size = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.preamble.type_3_post_ranging_size is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.preamble.type_3_pattern");
        if (cli_parm != NULL)
        {
            val.type_3_pattern = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.preamble.type_3_pattern is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, preamble, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_trx_preamble val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_TRX_CFG_ID_PREAMBLE, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, preamble, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "preamble");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, preamble);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, preamble);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.delimiter.");
    if (cli_parm != NULL)
    {
        bcmolt_trx_delimiter val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.delimiter.pattern");
        if (cli_parm != NULL)
        {
            if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 3)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "buffer filter.delimiter.pattern must have 3 bytes\n");
                return BCM_ERR_PARM;
            }

            bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
            bcmolt_buf_read(&cli_parm->value.buffer, val.pattern, 3);
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.delimiter.pattern is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.delimiter.size");
        if (cli_parm != NULL)
        {
            val.size = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.delimiter.size is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.delimiter.window_size");
        if (cli_parm != NULL)
        {
            val.window_size = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.delimiter.window_size is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, delimiter, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_trx_delimiter val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_TRX_CFG_ID_DELIMITER, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, delimiter, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "delimiter");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, delimiter);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, delimiter);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.guard_bits");
    if (cli_parm != NULL)
    {
        uint32_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, guard_bits, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, guard_bits, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_TRX_CFG_ID_GUARD_BITS, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "guard_bits");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, guard_bits);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, guard_bits);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.serdes_configuration.");
    if (cli_parm != NULL)
    {
        bcmolt_serdes_configuration val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.serdes_configuration.ranging_mode");
        if (cli_parm != NULL)
        {
            val.ranging_mode = (bcmolt_serdes_ranging_mode) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.serdes_configuration.ranging_mode is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.serdes_configuration.multi_ed_mode");
        if (cli_parm != NULL)
        {
            val.multi_ed_mode = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.serdes_configuration.multi_ed_mode is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.serdes_configuration.burst_enable_start_offset");
        if (cli_parm != NULL)
        {
            val.burst_enable_start_offset = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.serdes_configuration.burst_enable_start_offset is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.serdes_configuration.burst_enable_end_offset");
        if (cli_parm != NULL)
        {
            val.burst_enable_end_offset = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.serdes_configuration.burst_enable_end_offset is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.serdes_configuration.ed_invertion");
        if (cli_parm != NULL)
        {
            val.ed_invertion = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.serdes_configuration.ed_invertion is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, serdes_configuration, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_serdes_configuration val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_TRX_CFG_ID_SERDES_CONFIGURATION, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, serdes_configuration, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "serdes_configuration");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, serdes_configuration);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, serdes_configuration);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.plo_ranging");
    if (cli_parm != NULL)
    {
        uint32_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, plo_ranging, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, plo_ranging, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_TRX_CFG_ID_PLO_RANGING, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "plo_ranging");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, plo_ranging);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, plo_ranging);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.plo_data");
    if (cli_parm != NULL)
    {
        uint32_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, plo_data, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, plo_data, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_TRX_CFG_ID_PLO_DATA, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "plo_data");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, plo_data);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, plo_data);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.rssi_normal_config.");
    if (cli_parm != NULL)
    {
        bcmolt_gpon_rssi_general_configuration val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.rssi_normal_config.location");
        if (cli_parm != NULL)
        {
            val.location = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.rssi_normal_config.location is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.rssi_normal_config.location_sign");
        if (cli_parm != NULL)
        {
            val.location_sign = (bcmolt_rssi_location_sign) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.rssi_normal_config.location_sign is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.rssi_normal_config.start_pattern");
        if (cli_parm != NULL)
        {
            val.start_pattern = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.rssi_normal_config.start_pattern is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.rssi_normal_config.middle_pattern");
        if (cli_parm != NULL)
        {
            val.middle_pattern = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.rssi_normal_config.middle_pattern is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.rssi_normal_config.last_pattern");
        if (cli_parm != NULL)
        {
            val.last_pattern = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.rssi_normal_config.last_pattern is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.rssi_normal_config.middle_repertition");
        if (cli_parm != NULL)
        {
            val.middle_repertition = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.rssi_normal_config.middle_repertition is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.rssi_normal_config.minimum_burst");
        if (cli_parm != NULL)
        {
            val.minimum_burst = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.rssi_normal_config.minimum_burst is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, rssi_normal_config, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_gpon_rssi_general_configuration val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_TRX_CFG_ID_RSSI_NORMAL_CONFIG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, rssi_normal_config, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rssi_normal_config");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, rssi_normal_config);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, rssi_normal_config);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.ranging_rssi_resync_control.");
    if (cli_parm != NULL)
    {
        bcmolt_ranging_rssi_control val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.ranging_rssi_resync_control.after_no_ed");
        if (cli_parm != NULL)
        {
            val.after_no_ed = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ranging_rssi_resync_control.after_no_ed is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.ranging_rssi_resync_control.after_ed");
        if (cli_parm != NULL)
        {
            val.after_ed = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ranging_rssi_resync_control.after_ed is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.ranging_rssi_resync_control.after_reset_3");
        if (cli_parm != NULL)
        {
            val.after_reset_3 = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ranging_rssi_resync_control.after_reset_3 is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, ranging_rssi_resync_control, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_ranging_rssi_control val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_GPON_TRX_CFG_ID_RANGING_RSSI_RESYNC_CONTROL, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, gpon_trx, ranging_rssi_resync_control, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "ranging_rssi_resync_control");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, ranging_rssi_resync_control);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, ranging_rssi_resync_control);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_trx, transceiver_type) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_trx, la_configuration) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_trx, bcdr) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_trx, la_ranging_after_no_ed_resync) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_trx, bcdr_ranging_after_no_ed_resync) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_trx, la_ranging_after_ed_resync) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_trx, bcdr_ranging_after_ed_resync) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_trx, la_resync_polarity) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_trx, bcdr_resync_polarity) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_trx, bcdr_ranging_resync_conditions) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_trx, la_ranging_resync_conditions) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_trx, rx_configuration) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_trx, ranging_control_stages_configuration) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_trx, energy_detect) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_trx, end_of_burst_data_pattern) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_trx, end_of_burst_ranging_pattern) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_trx, preamble) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_trx, delimiter) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_trx, guard_bits) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_trx, serdes_configuration) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_trx, plo_ranging) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_trx, plo_data) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_trx, rssi_normal_config) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, gpon_trx, ranging_rssi_resync_control))
    {
        BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, all_properties);
        bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, gpon_trx, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);
    bcmcli_log("bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_log_entry_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_log_entry_cfg cfg;       /**< declare main API struct */
    bcmolt_log_entry_key key = { }; /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_log_entry_cfg cfg;\n");
    bcmcli_log("bcmolt_log_entry_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "log_id");
    if (cli_parm != NULL)
    {
        key.log_id = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "log_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.log_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_LOG_ENTRY, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_LOG_ENTRY_KEY_ID_LOG_ID, &key.log_id);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_parm_by_prefix(session, "name.");
    if (cli_parm != NULL)
    {
        cli_parm = bcmcli_find_named_parm(session, "name.str");
        if (cli_parm != NULL)
        {
            snprintf(key.name.str, 100, "%s", cli_parm->value.string);
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "name.str is not set\n");
            return BCM_ERR_PARM;
        }
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "name is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.name = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_LOG_ENTRY, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_LOG_ENTRY_KEY_ID_NAME, &key.name);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, log_entry, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, log_entry, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "default_log_level");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, log_entry, default_log_level);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, log_entry, default_log_level);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "default_log_type");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, log_entry, default_log_type);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, log_entry, default_log_type);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "log_level_print");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, log_entry, log_level_print);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, log_entry, log_level_print);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "log_level_save");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, log_entry, log_level_save);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, log_entry, log_level_save);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "log_type");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, log_entry, log_type);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, log_entry, log_type);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "log_style");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, log_entry, log_style);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, log_entry, log_style);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "log_name");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, log_entry, log_name);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, log_entry, log_name);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_CFG_PROP_IS_SET(&cfg, log_entry, default_log_level) && !BCMOLT_CFG_PROP_IS_SET(&cfg, log_entry, default_log_type) && !BCMOLT_CFG_PROP_IS_SET(&cfg, log_entry, log_level_print) && !BCMOLT_CFG_PROP_IS_SET(&cfg, log_entry, log_level_save) && !BCMOLT_CFG_PROP_IS_SET(&cfg, log_entry, log_type) && !BCMOLT_CFG_PROP_IS_SET(&cfg, log_entry, log_style) && !BCMOLT_CFG_PROP_IS_SET(&cfg, log_entry, log_name))
    {
        BCMOLT_CFG_PROP_GET(&cfg, log_entry, all_properties);
        bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, log_entry, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_get(device_id, &cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_log_entry_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_log_entry_cfg cfg;       /**< declare main API struct */
    bcmolt_log_entry_key key = { }; /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_log_entry_cfg cfg;\n");
    bcmcli_log("bcmolt_log_entry_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "log_id");
    if (cli_parm != NULL)
    {
        key.log_id = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "log_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.log_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_LOG_ENTRY, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_LOG_ENTRY_KEY_ID_LOG_ID, &key.log_id);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_parm_by_prefix(session, "name.");
    if (cli_parm != NULL)
    {
        cli_parm = bcmcli_find_named_parm(session, "name.str");
        if (cli_parm != NULL)
        {
            snprintf(key.name.str, 100, "%s", cli_parm->value.string);
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "name.str is not set\n");
            return BCM_ERR_PARM;
        }
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "name is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.name = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_LOG_ENTRY, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_LOG_ENTRY_KEY_ID_NAME, &key.name);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, log_entry, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, log_entry, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "log_level_print");
    if (cli_parm != NULL)
    {
        bcmolt_log_level val;
        val = (bcmolt_log_level) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, log_entry, log_level_print, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, log_entry, log_level_print, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_LOG_ENTRY, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_LOG_ENTRY_CFG_ID_LOG_LEVEL_PRINT, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "log_level_save");
    if (cli_parm != NULL)
    {
        bcmolt_log_level val;
        val = (bcmolt_log_level) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, log_entry, log_level_save, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, log_entry, log_level_save, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_LOG_ENTRY, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_LOG_ENTRY_CFG_ID_LOG_LEVEL_SAVE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "log_type");
    if (cli_parm != NULL)
    {
        bcmolt_log_type val;
        val = (bcmolt_log_type) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, log_entry, log_type, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, log_entry, log_type, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_LOG_ENTRY, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_LOG_ENTRY_CFG_ID_LOG_TYPE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "log_style");
    if (cli_parm != NULL)
    {
        bcmolt_log_style val;
        val = (bcmolt_log_style) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, log_entry, log_style, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, log_entry, log_style, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_LOG_ENTRY, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_LOG_ENTRY_CFG_ID_LOG_STYLE, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_cfg_set(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_set(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_log_entry_cfg_clear(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_log_entry_cfg cfg;       /**< declare main API struct */
    bcmolt_log_entry_key key = { }; /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_log_entry_cfg cfg;\n");
    bcmcli_log("bcmolt_log_entry_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_clear");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "log_id");
    if (cli_parm != NULL)
    {
        key.log_id = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "log_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.log_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_LOG_ENTRY, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_LOG_ENTRY_KEY_ID_LOG_ID, &key.log_id);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_parm_by_prefix(session, "name.");
    if (cli_parm != NULL)
    {
        cli_parm = bcmcli_find_named_parm(session, "name.str");
        if (cli_parm != NULL)
        {
            snprintf(key.name.str, 100, "%s", cli_parm->value.string);
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "name.str is not set\n");
            return BCM_ERR_PARM;
        }
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "name is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.name = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_LOG_ENTRY, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_LOG_ENTRY_KEY_ID_NAME, &key.name);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, log_entry, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, log_entry, key);\n");

    /* call API */
    err = bcmolt_cfg_clear(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_clear(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_log_entry_cfg_get_multi(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_log_entry_cfg cfg;       /**< declare main API struct */
    bcmolt_log_entry_key key = { }; /**< declare key */
    bcmolt_msg_set *msg_set = NULL; /**< declare message set */
    uint32_t max_msgs;              /**< declare max number of msgs to get */
    bcmos_bool invert_filter;       /**< declare filter invert flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_log_entry_cfg cfg;\n");
    bcmcli_log("bcmolt_log_entry_key key = {  };\n");
    bcmcli_log("bcmolt_msg_set* msg_set = NULL;\n");
    bcmcli_log("uint32_t max_msgs;\n");
    bcmcli_log("bcmos_bool invert_filter;\n");
    apicli_print_start(session, "bcmolt_cfg_get_multi");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "log_id");
    if (cli_parm != NULL)
    {
        key.log_id = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "log_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.log_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_LOG_ENTRY, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_LOG_ENTRY_KEY_ID_LOG_ID, &key.log_id);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_parm_by_prefix(session, "name.");
    if (cli_parm != NULL)
    {
        cli_parm = bcmcli_find_named_parm(session, "name.str");
        if (cli_parm != NULL)
        {
            snprintf(key.name.str, 100, "%s", cli_parm->value.string);
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "name.str is not set\n");
            return BCM_ERR_PARM;
        }
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "name is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.name = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_LOG_ENTRY, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_LOG_ENTRY_KEY_ID_NAME, &key.name);
    bcmcli_log(";\n");

    /* set max number of msgs from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "max_msgs");
    if (cli_parm != NULL)
    {
        max_msgs = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "max_msgs is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("max_msgs = %d;\n", max_msgs);

    /* set filter invert flag from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "filter_invert");
    if (cli_parm != NULL)
    {
        invert_filter = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "filter_invert is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("invert_filter = %s;\n", (invert_filter) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* allocate message set */
    err = apicli_msg_set_alloc(byte_pool, BCMOLT_OBJ_ID_LOG_ENTRY, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);
    if (err != BCM_ERR_OK)
    {
        return err;
    }

    bcmcli_log("bcmolt_msg_set_alloc(BCMOLT_OBJ_ID_LOG_ENTRY, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, log_entry, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, log_entry, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "filter.default_log_level");
    if (cli_parm != NULL)
    {
        bcmolt_log_level val;
        val = (bcmolt_log_level) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, log_entry, default_log_level, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, log_entry, default_log_level, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_LOG_ENTRY, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_LOG_ENTRY_CFG_ID_DEFAULT_LOG_LEVEL, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "default_log_level");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, log_entry, default_log_level);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, log_entry, default_log_level);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.default_log_type");
    if (cli_parm != NULL)
    {
        bcmolt_log_type val;
        val = (bcmolt_log_type) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, log_entry, default_log_type, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, log_entry, default_log_type, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_LOG_ENTRY, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_LOG_ENTRY_CFG_ID_DEFAULT_LOG_TYPE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "default_log_type");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, log_entry, default_log_type);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, log_entry, default_log_type);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.log_level_print");
    if (cli_parm != NULL)
    {
        bcmolt_log_level val;
        val = (bcmolt_log_level) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, log_entry, log_level_print, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, log_entry, log_level_print, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_LOG_ENTRY, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_LOG_ENTRY_CFG_ID_LOG_LEVEL_PRINT, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "log_level_print");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, log_entry, log_level_print);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, log_entry, log_level_print);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.log_level_save");
    if (cli_parm != NULL)
    {
        bcmolt_log_level val;
        val = (bcmolt_log_level) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, log_entry, log_level_save, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, log_entry, log_level_save, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_LOG_ENTRY, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_LOG_ENTRY_CFG_ID_LOG_LEVEL_SAVE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "log_level_save");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, log_entry, log_level_save);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, log_entry, log_level_save);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.log_type");
    if (cli_parm != NULL)
    {
        bcmolt_log_type val;
        val = (bcmolt_log_type) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, log_entry, log_type, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, log_entry, log_type, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_LOG_ENTRY, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_LOG_ENTRY_CFG_ID_LOG_TYPE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "log_type");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, log_entry, log_type);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, log_entry, log_type);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.log_style");
    if (cli_parm != NULL)
    {
        bcmolt_log_style val;
        val = (bcmolt_log_style) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, log_entry, log_style, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, log_entry, log_style, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_LOG_ENTRY, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_LOG_ENTRY_CFG_ID_LOG_STYLE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "log_style");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, log_entry, log_style);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, log_entry, log_style);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.log_name.");
    if (cli_parm != NULL)
    {
        bcmolt_str_100 val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.log_name.str");
        if (cli_parm != NULL)
        {
            snprintf(val.str, 100, "%s", cli_parm->value.string);
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.log_name.str is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, log_entry, log_name, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_str_100 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_LOG_ENTRY, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_LOG_ENTRY_CFG_ID_LOG_NAME, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, log_entry, log_name, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "log_name");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, log_entry, log_name);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, log_entry, log_name);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, log_entry, default_log_level) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, log_entry, default_log_type) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, log_entry, log_level_print) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, log_entry, log_level_save) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, log_entry, log_type) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, log_entry, log_style) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, log_entry, log_name))
    {
        BCMOLT_MSGSET_CFG_PROP_GET(msg_set, log_entry, all_properties);
        bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, log_entry, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);
    bcmcli_log("bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_log_entry_stat_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_log_entry_stat stat;     /**< declare main API struct */
    bcmolt_log_entry_key key = { }; /**< declare key */
    bcmos_bool clear_on_read;       /**< declare 'clear on read' flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_log_entry_stat stat;\n");
    bcmcli_log("bcmolt_log_entry_key key = {  };\n");
    bcmcli_log("bcmos_bool clear_on_read;\n");
    apicli_print_start(session, "bcmolt_stat_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "log_id");
    if (cli_parm != NULL)
    {
        key.log_id = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "log_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.log_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_LOG_ENTRY, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_LOG_ENTRY_KEY_ID_LOG_ID, &key.log_id);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_parm_by_prefix(session, "name.");
    if (cli_parm != NULL)
    {
        cli_parm = bcmcli_find_named_parm(session, "name.str");
        if (cli_parm != NULL)
        {
            snprintf(key.name.str, 100, "%s", cli_parm->value.string);
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "name.str is not set\n");
            return BCM_ERR_PARM;
        }
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "name is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.name = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_LOG_ENTRY, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_LOG_ENTRY_KEY_ID_NAME, &key.name);
    bcmcli_log(";\n");

    /* set stat flags from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "clear");
    if (cli_parm != NULL)
    {
        clear_on_read = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "clear is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("clear_on_read = %s;\n", (clear_on_read) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* init the API struct */
    BCMOLT_STAT_INIT(&stat, log_entry, key);
    bcmcli_log("BCMOLT_STAT_INIT(&stat, log_entry, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "msg_count");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, log_entry, msg_count);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, log_entry, msg_count);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "lost_msg_count");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, log_entry, lost_msg_count);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, log_entry, lost_msg_count);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_STAT_PROP_IS_SET(&stat, log_entry, msg_count) && !BCMOLT_STAT_PROP_IS_SET(&stat, log_entry, lost_msg_count))
    {
        BCMOLT_STAT_PROP_GET(&stat, log_entry, all_properties);
        bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, log_entry, all_properties);\n");
    }

    /* call API */
    err = bcmolt_stat_get(device_id, &stat.hdr, clear_on_read);
    bcmcli_log("bcmolt_stat_get(device_id, &stat.hdr, clear_on_read);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &stat.hdr.hdr);
    }

    apicli_print_complete(session, err, stat.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_log_entry_stat_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_log_entry_stat_cfg stat_cfg; /**< declare main API struct */
    bcmolt_log_entry_key key = { };     /**< declare key */
    bcmolt_log_entry_stat_id stat_id;   /**< declare stat ID */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_log_entry_stat_cfg stat_cfg;\n");
    bcmcli_log("bcmolt_log_entry_key key = {  };\n");
    apicli_print_start(session, "bcmolt_stat_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "log_id");
    if (cli_parm != NULL)
    {
        key.log_id = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "log_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.log_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_LOG_ENTRY, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_LOG_ENTRY_KEY_ID_LOG_ID, &key.log_id);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_parm_by_prefix(session, "name.");
    if (cli_parm != NULL)
    {
        cli_parm = bcmcli_find_named_parm(session, "name.str");
        if (cli_parm != NULL)
        {
            snprintf(key.name.str, 100, "%s", cli_parm->value.string);
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "name.str is not set\n");
            return BCM_ERR_PARM;
        }
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "name is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.name = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_LOG_ENTRY, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_LOG_ENTRY_KEY_ID_NAME, &key.name);
    bcmcli_log(";\n");

    /* set stat ID from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "sub");
    if (cli_parm != NULL)
    {
        stat_id = (bcmolt_log_entry_stat_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
        return BCM_ERR_PARM;
    }

    /* init the API struct */
    switch (stat_id)
    {
        case BCMOLT_LOG_ENTRY_STAT_ID_MSG_COUNT:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, log_entry, msg_count, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, log_entry, msg_count, key);\n");
            break;
        case BCMOLT_LOG_ENTRY_STAT_ID_LOST_MSG_COUNT:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, log_entry, lost_msg_count, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, log_entry, lost_msg_count, key);\n");
            break;
        default:
            apicli_print_complete(session, BCM_ERR_RANGE, "\n");
            return BCM_ERR_RANGE;
    }

    /* call API */
    err = bcmolt_stat_cfg_get(device_id, &stat_cfg.hdr);
    bcmcli_log("bcmolt_stat_cfg_get(device_id, &stat_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &stat_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, stat_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_log_entry_stat_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_log_entry_stat_cfg stat_cfg; /**< declare main API struct */
    bcmolt_log_entry_key key = { };     /**< declare key */
    bcmolt_log_entry_stat_id stat_id;   /**< declare stat ID */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_log_entry_stat_cfg stat_cfg;\n");
    bcmcli_log("bcmolt_log_entry_key key = {  };\n");
    apicli_print_start(session, "bcmolt_stat_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "log_id");
    if (cli_parm != NULL)
    {
        key.log_id = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "log_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.log_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_LOG_ENTRY, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_LOG_ENTRY_KEY_ID_LOG_ID, &key.log_id);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_parm_by_prefix(session, "name.");
    if (cli_parm != NULL)
    {
        cli_parm = bcmcli_find_named_parm(session, "name.str");
        if (cli_parm != NULL)
        {
            snprintf(key.name.str, 100, "%s", cli_parm->value.string);
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "name.str is not set\n");
            return BCM_ERR_PARM;
        }
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "name is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.name = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_LOG_ENTRY, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_LOG_ENTRY_KEY_ID_NAME, &key.name);
    bcmcli_log(";\n");

    /* set stat ID from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "sub");
    if (cli_parm != NULL)
    {
        stat_id = (bcmolt_log_entry_stat_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
        return BCM_ERR_PARM;
    }

    /* init the API struct */
    switch (stat_id)
    {
        case BCMOLT_LOG_ENTRY_STAT_ID_MSG_COUNT:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, log_entry, msg_count, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, log_entry, msg_count, key);\n");
            break;
        case BCMOLT_LOG_ENTRY_STAT_ID_LOST_MSG_COUNT:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, log_entry, lost_msg_count, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, log_entry, lost_msg_count, key);\n");
            break;
        default:
            apicli_print_complete(session, BCM_ERR_RANGE, "\n");
            return BCM_ERR_RANGE;
    }

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.");
    if (cli_parm != NULL)
    {
        bcmolt_stat_alarm_config val = { };
        cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.trigger.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.type");
            if (cli_parm != NULL)
            {
                val.trigger.type = (bcmolt_stat_condition_type) cli_parm->value.enum_val;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.type is not set\n");
                return BCM_ERR_PARM;
            }

            switch (val.trigger.type)
            {
                case BCMOLT_STAT_CONDITION_TYPE_RATE_THRESHOLD:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.rising");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_threshold.rising = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.rising is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.falling");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_threshold.falling = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.falling is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_RATE_RANGE:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.upper");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_range.upper = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.upper is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.lower");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_range.lower = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.lower is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_VALUE_THRESHOLD:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.limit");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.value_threshold.limit = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.limit is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_NONE:
                    break;
                default:
                    apicli_print_complete(session, BCM_ERR_RANGE, "\n");
                    return BCM_ERR_RANGE;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.soak.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "cfg.soak.active_soak_time");
            if (cli_parm != NULL)
            {
                val.soak.active_soak_time = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak.active_soak_time is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "cfg.soak.clear_soak_time");
            if (cli_parm != NULL)
            {
                val.soak.clear_soak_time = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak.clear_soak_time is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_STAT_CFG_PROP_SET(&stat_cfg, log_entry, cfg, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_stat_alarm_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_LOG_ENTRY, BCMOLT_MGT_GROUP_STAT_CFG, 0, BCMOLT_LOG_ENTRY_STAT_CFG_ID_CFG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_STAT_CFG_PROP_SET(&stat_cfg, log_entry, cfg, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_stat_cfg_set(device_id, &stat_cfg.hdr);
    bcmcli_log("bcmolt_stat_cfg_set(device_id, &stat_cfg.hdr);\n");
    apicli_print_complete(session, err, stat_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_log_entry_auto_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_log_entry_auto_cfg auto_cfg; /**< declare main API struct */
    bcmolt_log_entry_key key = { };     /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_log_entry_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_log_entry_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_get");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, log_entry, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, log_entry, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_cleared");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, log_entry, stat_alarm_cleared);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, log_entry, stat_alarm_cleared);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_raised");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, log_entry, stat_alarm_raised);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, log_entry, stat_alarm_raised);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, log_entry, stat_alarm_cleared) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, log_entry, stat_alarm_raised))
    {
        BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, log_entry, all_properties);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, log_entry, all_properties);\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &auto_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_log_entry_auto_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_log_entry_auto_cfg auto_cfg; /**< declare main API struct */
    bcmolt_log_entry_key key = { };     /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_log_entry_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_log_entry_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_set");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, log_entry, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, log_entry, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_cleared");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, log_entry, stat_alarm_cleared, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, log_entry, stat_alarm_cleared, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_LOG_ENTRY, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_LOG_ENTRY_AUTO_CFG_ID_STAT_ALARM_CLEARED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_raised");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, log_entry, stat_alarm_raised, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, log_entry, stat_alarm_raised, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_LOG_ENTRY, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_LOG_ENTRY_AUTO_CFG_ID_STAT_ALARM_RAISED, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);\n");
    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_logger_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_logger_cfg cfg;          /**< declare main API struct */
    bcmolt_logger_key key = { };    /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_logger_cfg cfg;\n");
    bcmcli_log("bcmolt_logger_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "file_id");
    if (cli_parm != NULL)
    {
        key.file_id = (bcmolt_log_file_id) cli_parm->value.enum_val;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "file_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.file_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_LOGGER, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_LOGGER_KEY_ID_FILE_ID, &key.file_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, logger, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, logger, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "buffer");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, logger, buffer);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, logger, buffer);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "wrap_around");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, logger, wrap_around);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, logger, wrap_around);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "clear_after_read");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, logger, clear_after_read);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, logger, clear_after_read);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "enable_log");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, logger, enable_log);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, logger, enable_log);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "log_names");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, logger, log_names);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, logger, log_names);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_CFG_PROP_IS_SET(&cfg, logger, buffer) && !BCMOLT_CFG_PROP_IS_SET(&cfg, logger, wrap_around) && !BCMOLT_CFG_PROP_IS_SET(&cfg, logger, clear_after_read) && !BCMOLT_CFG_PROP_IS_SET(&cfg, logger, enable_log) && !BCMOLT_CFG_PROP_IS_SET(&cfg, logger, log_names))
    {
        BCMOLT_CFG_PROP_GET(&cfg, logger, all_properties);
        bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, logger, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_get(device_id, &cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_logger_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_logger_cfg cfg;          /**< declare main API struct */
    bcmolt_logger_key key = { };    /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_logger_cfg cfg;\n");
    bcmcli_log("bcmolt_logger_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "file_id");
    if (cli_parm != NULL)
    {
        key.file_id = (bcmolt_log_file_id) cli_parm->value.enum_val;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "file_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.file_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_LOGGER, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_LOGGER_KEY_ID_FILE_ID, &key.file_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, logger, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, logger, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "wrap_around");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, logger, wrap_around, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, logger, wrap_around, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_LOGGER, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_LOGGER_CFG_ID_WRAP_AROUND, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "clear_after_read");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, logger, clear_after_read, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, logger, clear_after_read, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_LOGGER, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_LOGGER_CFG_ID_CLEAR_AFTER_READ, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "enable_log");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, logger, enable_log, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, logger, enable_log, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_LOGGER, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_LOGGER_CFG_ID_ENABLE_LOG, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_cfg_set(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_set(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_logger_cfg_clear(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_logger_cfg cfg;          /**< declare main API struct */
    bcmolt_logger_key key = { };    /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_logger_cfg cfg;\n");
    bcmcli_log("bcmolt_logger_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_clear");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "file_id");
    if (cli_parm != NULL)
    {
        key.file_id = (bcmolt_log_file_id) cli_parm->value.enum_val;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "file_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.file_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_LOGGER, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_LOGGER_KEY_ID_FILE_ID, &key.file_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, logger, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, logger, key);\n");

    /* call API */
    err = bcmolt_cfg_clear(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_clear(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_logger_cfg_get_multi(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_logger_cfg cfg;          /**< declare main API struct */
    bcmolt_logger_key key = { };    /**< declare key */
    bcmolt_msg_set *msg_set = NULL; /**< declare message set */
    uint32_t max_msgs;              /**< declare max number of msgs to get */
    bcmos_bool invert_filter;       /**< declare filter invert flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_logger_cfg cfg;\n");
    bcmcli_log("bcmolt_logger_key key = {  };\n");
    bcmcli_log("bcmolt_msg_set* msg_set = NULL;\n");
    bcmcli_log("uint32_t max_msgs;\n");
    bcmcli_log("bcmos_bool invert_filter;\n");
    apicli_print_start(session, "bcmolt_cfg_get_multi");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "file_id");
    if (cli_parm != NULL)
    {
        key.file_id = (bcmolt_log_file_id) cli_parm->value.enum_val;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "file_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.file_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_LOGGER, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_LOGGER_KEY_ID_FILE_ID, &key.file_id);
    bcmcli_log(";\n");

    /* set max number of msgs from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "max_msgs");
    if (cli_parm != NULL)
    {
        max_msgs = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "max_msgs is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("max_msgs = %d;\n", max_msgs);

    /* set filter invert flag from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "filter_invert");
    if (cli_parm != NULL)
    {
        invert_filter = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "filter_invert is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("invert_filter = %s;\n", (invert_filter) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* allocate message set */
    err = apicli_msg_set_alloc(byte_pool, BCMOLT_OBJ_ID_LOGGER, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);
    if (err != BCM_ERR_OK)
    {
        return err;
    }

    bcmcli_log("bcmolt_msg_set_alloc(BCMOLT_OBJ_ID_LOGGER, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, logger, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, logger, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.buffer.");
    if (cli_parm != NULL)
    {
        bcmolt_log_buffer val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.buffer.buff");
        if (cli_parm != NULL)
        {
            snprintf(val.buff, 2048, "%s", cli_parm->value.string);
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.buffer.buff is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.buffer.msg_to_read");
        if (cli_parm != NULL)
        {
            val.msg_to_read = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.buffer.msg_to_read is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, logger, buffer, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_log_buffer val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_LOGGER, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_LOGGER_CFG_ID_BUFFER, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, logger, buffer, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "buffer");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, logger, buffer);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, logger, buffer);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.wrap_around");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, logger, wrap_around, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, logger, wrap_around, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_LOGGER, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_LOGGER_CFG_ID_WRAP_AROUND, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "wrap_around");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, logger, wrap_around);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, logger, wrap_around);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.clear_after_read");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, logger, clear_after_read, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, logger, clear_after_read, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_LOGGER, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_LOGGER_CFG_ID_CLEAR_AFTER_READ, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "clear_after_read");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, logger, clear_after_read);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, logger, clear_after_read);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.enable_log");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, logger, enable_log, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, logger, enable_log, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_LOGGER, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_LOGGER_CFG_ID_ENABLE_LOG, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "enable_log");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, logger, enable_log);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, logger, enable_log);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.log_names.");
    if (cli_parm != NULL)
    {
        bcmolt_str_1000 val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.log_names.str");
        if (cli_parm != NULL)
        {
            snprintf(val.str, 1000, "%s", cli_parm->value.string);
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.log_names.str is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, logger, log_names, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_str_1000 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_LOGGER, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_LOGGER_CFG_ID_LOG_NAMES, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, logger, log_names, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "log_names");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, logger, log_names);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, logger, log_names);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, logger, buffer) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, logger, wrap_around) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, logger, clear_after_read) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, logger, enable_log) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, logger, log_names))
    {
        BCMOLT_MSGSET_CFG_PROP_GET(msg_set, logger, all_properties);
        bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, logger, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);
    bcmcli_log("bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_logger_stat_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_logger_stat stat;        /**< declare main API struct */
    bcmolt_logger_key key = { };    /**< declare key */
    bcmos_bool clear_on_read;       /**< declare 'clear on read' flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_logger_stat stat;\n");
    bcmcli_log("bcmolt_logger_key key = {  };\n");
    bcmcli_log("bcmos_bool clear_on_read;\n");
    apicli_print_start(session, "bcmolt_stat_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "file_id");
    if (cli_parm != NULL)
    {
        key.file_id = (bcmolt_log_file_id) cli_parm->value.enum_val;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "file_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.file_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_LOGGER, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_LOGGER_KEY_ID_FILE_ID, &key.file_id);
    bcmcli_log(";\n");

    /* set stat flags from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "clear");
    if (cli_parm != NULL)
    {
        clear_on_read = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "clear is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("clear_on_read = %s;\n", (clear_on_read) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* init the API struct */
    BCMOLT_STAT_INIT(&stat, logger, key);
    bcmcli_log("BCMOLT_STAT_INIT(&stat, logger, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "lines_in_log");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, logger, lines_in_log);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, logger, lines_in_log);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_STAT_PROP_IS_SET(&stat, logger, lines_in_log))
    {
        BCMOLT_STAT_PROP_GET(&stat, logger, all_properties);
        bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, logger, all_properties);\n");
    }

    /* call API */
    err = bcmolt_stat_get(device_id, &stat.hdr, clear_on_read);
    bcmcli_log("bcmolt_stat_get(device_id, &stat.hdr, clear_on_read);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &stat.hdr.hdr);
    }

    apicli_print_complete(session, err, stat.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_logger_oper_clear_log_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_logger_clear_log oper;   /**< declare main API struct */
    bcmolt_logger_key key = { };    /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_logger_clear_log oper;\n");
    bcmcli_log("bcmolt_logger_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "file_id");
    if (cli_parm != NULL)
    {
        key.file_id = (bcmolt_log_file_id) cli_parm->value.enum_val;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "file_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.file_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_LOGGER, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_LOGGER_KEY_ID_FILE_ID, &key.file_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, logger, clear_log, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, logger, clear_log, key);\n");

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_logger_stat_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_logger_stat_cfg stat_cfg;    /**< declare main API struct */
    bcmolt_logger_key key = { };        /**< declare key */
    bcmolt_logger_stat_id stat_id;      /**< declare stat ID */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_logger_stat_cfg stat_cfg;\n");
    bcmcli_log("bcmolt_logger_key key = {  };\n");
    apicli_print_start(session, "bcmolt_stat_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "file_id");
    if (cli_parm != NULL)
    {
        key.file_id = (bcmolt_log_file_id) cli_parm->value.enum_val;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "file_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.file_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_LOGGER, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_LOGGER_KEY_ID_FILE_ID, &key.file_id);
    bcmcli_log(";\n");

    /* set stat ID from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "sub");
    if (cli_parm != NULL)
    {
        stat_id = (bcmolt_logger_stat_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
        return BCM_ERR_PARM;
    }

    /* init the API struct */
    switch (stat_id)
    {
        case BCMOLT_LOGGER_STAT_ID_LINES_IN_LOG:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, logger, lines_in_log, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, logger, lines_in_log, key);\n");
            break;
        default:
            apicli_print_complete(session, BCM_ERR_RANGE, "\n");
            return BCM_ERR_RANGE;
    }

    /* call API */
    err = bcmolt_stat_cfg_get(device_id, &stat_cfg.hdr);
    bcmcli_log("bcmolt_stat_cfg_get(device_id, &stat_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &stat_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, stat_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_logger_stat_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_logger_stat_cfg stat_cfg;    /**< declare main API struct */
    bcmolt_logger_key key = { };        /**< declare key */
    bcmolt_logger_stat_id stat_id;      /**< declare stat ID */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_logger_stat_cfg stat_cfg;\n");
    bcmcli_log("bcmolt_logger_key key = {  };\n");
    apicli_print_start(session, "bcmolt_stat_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "file_id");
    if (cli_parm != NULL)
    {
        key.file_id = (bcmolt_log_file_id) cli_parm->value.enum_val;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "file_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.file_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_LOGGER, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_LOGGER_KEY_ID_FILE_ID, &key.file_id);
    bcmcli_log(";\n");

    /* set stat ID from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "sub");
    if (cli_parm != NULL)
    {
        stat_id = (bcmolt_logger_stat_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
        return BCM_ERR_PARM;
    }

    /* init the API struct */
    switch (stat_id)
    {
        case BCMOLT_LOGGER_STAT_ID_LINES_IN_LOG:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, logger, lines_in_log, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, logger, lines_in_log, key);\n");
            break;
        default:
            apicli_print_complete(session, BCM_ERR_RANGE, "\n");
            return BCM_ERR_RANGE;
    }

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.");
    if (cli_parm != NULL)
    {
        bcmolt_stat_alarm_config val = { };
        cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.trigger.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.type");
            if (cli_parm != NULL)
            {
                val.trigger.type = (bcmolt_stat_condition_type) cli_parm->value.enum_val;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.type is not set\n");
                return BCM_ERR_PARM;
            }

            switch (val.trigger.type)
            {
                case BCMOLT_STAT_CONDITION_TYPE_RATE_THRESHOLD:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.rising");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_threshold.rising = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.rising is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.falling");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_threshold.falling = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.falling is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_RATE_RANGE:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.upper");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_range.upper = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.upper is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.lower");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_range.lower = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.lower is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_VALUE_THRESHOLD:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.limit");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.value_threshold.limit = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.limit is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_NONE:
                    break;
                default:
                    apicli_print_complete(session, BCM_ERR_RANGE, "\n");
                    return BCM_ERR_RANGE;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.soak.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "cfg.soak.active_soak_time");
            if (cli_parm != NULL)
            {
                val.soak.active_soak_time = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak.active_soak_time is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "cfg.soak.clear_soak_time");
            if (cli_parm != NULL)
            {
                val.soak.clear_soak_time = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak.clear_soak_time is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_STAT_CFG_PROP_SET(&stat_cfg, logger, cfg, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_stat_alarm_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_LOGGER, BCMOLT_MGT_GROUP_STAT_CFG, 0, BCMOLT_LOGGER_STAT_CFG_ID_CFG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_STAT_CFG_PROP_SET(&stat_cfg, logger, cfg, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_stat_cfg_set(device_id, &stat_cfg.hdr);
    bcmcli_log("bcmolt_stat_cfg_set(device_id, &stat_cfg.hdr);\n");
    apicli_print_complete(session, err, stat_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_logger_auto_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_logger_auto_cfg auto_cfg;    /**< declare main API struct */
    bcmolt_logger_key key = { };        /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_logger_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_logger_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_get");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, logger, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, logger, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_cleared");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, logger, stat_alarm_cleared);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, logger, stat_alarm_cleared);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_raised");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, logger, stat_alarm_raised);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, logger, stat_alarm_raised);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, logger, stat_alarm_cleared) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, logger, stat_alarm_raised))
    {
        BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, logger, all_properties);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, logger, all_properties);\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &auto_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_logger_auto_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_logger_auto_cfg auto_cfg;    /**< declare main API struct */
    bcmolt_logger_key key = { };        /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_logger_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_logger_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_set");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, logger, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, logger, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_cleared");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, logger, stat_alarm_cleared, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, logger, stat_alarm_cleared, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_LOGGER, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_LOGGER_AUTO_CFG_ID_STAT_ALARM_CLEARED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_raised");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, logger, stat_alarm_raised, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, logger, stat_alarm_raised, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_LOGGER, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_LOGGER_AUTO_CFG_ID_STAT_ALARM_RAISED, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);\n");
    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_nni_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_nni_cfg cfg;         /**< declare main API struct */
    bcmolt_nni_key key = { };   /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_nni_cfg cfg;\n");
    bcmcli_log("bcmolt_nni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_pon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_NNI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_NNI_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, nni, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, nni, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "remote_loopback");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, nni, remote_loopback);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, nni, remote_loopback);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "line_loopback");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, nni, line_loopback);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, nni, line_loopback);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "mac_address");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, nni, mac_address);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, nni, mac_address);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "nni_status");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, nni, nni_status);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, nni, nni_status);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "nni_backup_status");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, nni, nni_backup_status);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, nni, nni_backup_status);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "active_nni");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, nni, active_nni);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, nni, active_nni);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "nni_status_polling_interval_ms");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, nni, nni_status_polling_interval_ms);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, nni, nni_status_polling_interval_ms);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "autoswitch");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, nni, autoswitch);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, nni, autoswitch);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "flow_control");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, nni, flow_control);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, nni, flow_control);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_CFG_PROP_IS_SET(&cfg, nni, remote_loopback) && !BCMOLT_CFG_PROP_IS_SET(&cfg, nni, line_loopback) && !BCMOLT_CFG_PROP_IS_SET(&cfg, nni, mac_address) && !BCMOLT_CFG_PROP_IS_SET(&cfg, nni, nni_status) && !BCMOLT_CFG_PROP_IS_SET(&cfg, nni, nni_backup_status) && !BCMOLT_CFG_PROP_IS_SET(&cfg, nni, active_nni) && !BCMOLT_CFG_PROP_IS_SET(&cfg, nni, nni_status_polling_interval_ms) && !BCMOLT_CFG_PROP_IS_SET(&cfg, nni, autoswitch) && !BCMOLT_CFG_PROP_IS_SET(&cfg, nni, flow_control))
    {
        BCMOLT_CFG_PROP_GET(&cfg, nni, all_properties);
        bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, nni, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_get(device_id, &cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_nni_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_nni_cfg cfg;         /**< declare main API struct */
    bcmolt_nni_key key = { };   /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_nni_cfg cfg;\n");
    bcmcli_log("bcmolt_nni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_pon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_NNI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_NNI_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, nni, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, nni, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "remote_loopback");
    if (cli_parm != NULL)
    {
        bcmolt_control_state val;
        val = (bcmolt_control_state) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, nni, remote_loopback, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, nni, remote_loopback, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_NNI_CFG_ID_REMOTE_LOOPBACK, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "line_loopback");
    if (cli_parm != NULL)
    {
        bcmolt_control_state val;
        val = (bcmolt_control_state) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, nni, line_loopback, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, nni, line_loopback, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_NNI_CFG_ID_LINE_LOOPBACK, &val);
        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;
        BCMOLT_CFG_PROP_SET(&cfg, nni, mac_address, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, nni, mac_address, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_NNI_CFG_ID_MAC_ADDRESS, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "active_nni");
    if (cli_parm != NULL)
    {
        bcmolt_nni_connection val;
        val = (bcmolt_nni_connection) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, nni, active_nni, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, nni, active_nni, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_NNI_CFG_ID_ACTIVE_NNI, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "nni_status_polling_interval_ms");
    if (cli_parm != NULL)
    {
        uint32_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, nni, nni_status_polling_interval_ms, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, nni, nni_status_polling_interval_ms, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_NNI_CFG_ID_NNI_STATUS_POLLING_INTERVAL_MS, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "autoswitch");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, nni, autoswitch, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, nni, autoswitch, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_NNI_CFG_ID_AUTOSWITCH, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "flow_control");
    if (cli_parm != NULL)
    {
        bcmolt_control_state val;
        val = (bcmolt_control_state) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, nni, flow_control, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, nni, flow_control, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_NNI_CFG_ID_FLOW_CONTROL, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_cfg_set(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_set(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_nni_cfg_clear(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_nni_cfg cfg;         /**< declare main API struct */
    bcmolt_nni_key key = { };   /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_nni_cfg cfg;\n");
    bcmcli_log("bcmolt_nni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_clear");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_pon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_NNI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_NNI_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, nni, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, nni, key);\n");

    /* call API */
    err = bcmolt_cfg_clear(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_clear(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_nni_cfg_get_multi(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_nni_cfg cfg;             /**< declare main API struct */
    bcmolt_nni_key key = { };       /**< declare key */
    bcmolt_msg_set *msg_set = NULL; /**< declare message set */
    uint32_t max_msgs;              /**< declare max number of msgs to get */
    bcmos_bool invert_filter;       /**< declare filter invert flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_nni_cfg cfg;\n");
    bcmcli_log("bcmolt_nni_key key = {  };\n");
    bcmcli_log("bcmolt_msg_set* msg_set = NULL;\n");
    bcmcli_log("uint32_t max_msgs;\n");
    bcmcli_log("bcmos_bool invert_filter;\n");
    apicli_print_start(session, "bcmolt_cfg_get_multi");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_pon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_NNI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_NNI_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* set max number of msgs from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "max_msgs");
    if (cli_parm != NULL)
    {
        max_msgs = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "max_msgs is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("max_msgs = %d;\n", max_msgs);

    /* set filter invert flag from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "filter_invert");
    if (cli_parm != NULL)
    {
        invert_filter = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "filter_invert is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("invert_filter = %s;\n", (invert_filter) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* allocate message set */
    err = apicli_msg_set_alloc(byte_pool, BCMOLT_OBJ_ID_NNI, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);
    if (err != BCM_ERR_OK)
    {
        return err;
    }

    bcmcli_log("bcmolt_msg_set_alloc(BCMOLT_OBJ_ID_NNI, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, nni, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, nni, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "filter.remote_loopback");
    if (cli_parm != NULL)
    {
        bcmolt_control_state val;
        val = (bcmolt_control_state) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, nni, remote_loopback, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, nni, remote_loopback, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_NNI_CFG_ID_REMOTE_LOOPBACK, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "remote_loopback");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni, remote_loopback);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni, remote_loopback);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.line_loopback");
    if (cli_parm != NULL)
    {
        bcmolt_control_state val;
        val = (bcmolt_control_state) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, nni, line_loopback, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, nni, line_loopback, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_NNI_CFG_ID_LINE_LOOPBACK, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "line_loopback");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni, line_loopback);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni, line_loopback);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.mac_address");
    if (cli_parm != NULL)
    {
        bcmos_mac_address val;
        val = cli_parm->value.mac;
        BCMOLT_CFG_PROP_SET(&cfg, nni, mac_address, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, nni, mac_address, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_NNI_CFG_ID_MAC_ADDRESS, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "mac_address");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni, mac_address);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni, mac_address);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.nni_status.");
    if (cli_parm != NULL)
    {
        bcmolt_nni_link_status val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.nni_status.link_status");
        if (cli_parm != NULL)
        {
            val.link_status = (bcmolt_trivalent) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.nni_status.link_status is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.nni_status.signal_detected");
        if (cli_parm != NULL)
        {
            val.signal_detected = (bcmolt_trivalent) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.nni_status.signal_detected is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.nni_status.pmd_locked");
        if (cli_parm != NULL)
        {
            val.pmd_locked = (bcmolt_trivalent) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.nni_status.pmd_locked is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, nni, nni_status, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_nni_link_status val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_NNI_CFG_ID_NNI_STATUS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, nni, nni_status, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "nni_status");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni, nni_status);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni, nni_status);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.nni_backup_status.");
    if (cli_parm != NULL)
    {
        bcmolt_nni_link_status val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.nni_backup_status.link_status");
        if (cli_parm != NULL)
        {
            val.link_status = (bcmolt_trivalent) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.nni_backup_status.link_status is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.nni_backup_status.signal_detected");
        if (cli_parm != NULL)
        {
            val.signal_detected = (bcmolt_trivalent) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.nni_backup_status.signal_detected is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.nni_backup_status.pmd_locked");
        if (cli_parm != NULL)
        {
            val.pmd_locked = (bcmolt_trivalent) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.nni_backup_status.pmd_locked is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, nni, nni_backup_status, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_nni_link_status val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_NNI_CFG_ID_NNI_BACKUP_STATUS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, nni, nni_backup_status, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "nni_backup_status");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni, nni_backup_status);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni, nni_backup_status);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.active_nni");
    if (cli_parm != NULL)
    {
        bcmolt_nni_connection val;
        val = (bcmolt_nni_connection) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, nni, active_nni, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, nni, active_nni, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_NNI_CFG_ID_ACTIVE_NNI, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "active_nni");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni, active_nni);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni, active_nni);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.nni_status_polling_interval_ms");
    if (cli_parm != NULL)
    {
        uint32_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, nni, nni_status_polling_interval_ms, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, nni, nni_status_polling_interval_ms, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_NNI_CFG_ID_NNI_STATUS_POLLING_INTERVAL_MS, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "nni_status_polling_interval_ms");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni, nni_status_polling_interval_ms);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni, nni_status_polling_interval_ms);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.autoswitch");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, nni, autoswitch, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, nni, autoswitch, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_NNI_CFG_ID_AUTOSWITCH, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "autoswitch");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni, autoswitch);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni, autoswitch);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.flow_control");
    if (cli_parm != NULL)
    {
        bcmolt_control_state val;
        val = (bcmolt_control_state) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, nni, flow_control, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, nni, flow_control, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_NNI_CFG_ID_FLOW_CONTROL, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "flow_control");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni, flow_control);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni, flow_control);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, nni, remote_loopback) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, nni, line_loopback) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, nni, mac_address) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, nni, nni_status) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, nni, nni_backup_status) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, nni, active_nni) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, nni, nni_status_polling_interval_ms) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, nni, autoswitch) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, nni, flow_control))
    {
        BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni, all_properties);
        bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);
    bcmcli_log("bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_nni_stat_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_nni_stat stat;       /**< declare main API struct */
    bcmolt_nni_key key = { };   /**< declare key */
    bcmos_bool clear_on_read;   /**< declare 'clear on read' flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_nni_stat stat;\n");
    bcmcli_log("bcmolt_nni_key key = {  };\n");
    bcmcli_log("bcmos_bool clear_on_read;\n");
    apicli_print_start(session, "bcmolt_stat_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_pon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_NNI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_NNI_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* set stat flags from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "clear");
    if (cli_parm != NULL)
    {
        clear_on_read = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "clear is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("clear_on_read = %s;\n", (clear_on_read) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* init the API struct */
    BCMOLT_STAT_INIT(&stat, nni, key);
    bcmcli_log("BCMOLT_STAT_INIT(&stat, nni, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "rx_frames_64");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, rx_frames_64);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, rx_frames_64);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_frames_65_127");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, rx_frames_65_127);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, rx_frames_65_127);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_frames_128_255");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, rx_frames_128_255);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, rx_frames_128_255);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_frames_256_511");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, rx_frames_256_511);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, rx_frames_256_511);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_frames_512_1023");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, rx_frames_512_1023);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, rx_frames_512_1023);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_frames_1024_1518");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, rx_frames_1024_1518);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, rx_frames_1024_1518);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_frames_1519_2047");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, rx_frames_1519_2047);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, rx_frames_1519_2047);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_frames_2048_4095");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, rx_frames_2048_4095);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, rx_frames_2048_4095);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_frames_4096_9216");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, rx_frames_4096_9216);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, rx_frames_4096_9216);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_frames_9217_16383");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, rx_frames_9217_16383);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, rx_frames_9217_16383);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, rx_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, rx_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_bytes");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, rx_bytes);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, rx_bytes);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_good_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, rx_good_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, rx_good_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_unicast_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, rx_unicast_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, rx_unicast_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_multicast_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, rx_multicast_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, rx_multicast_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_broadcast_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, rx_broadcast_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, rx_broadcast_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_fcs_errors");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, rx_fcs_errors);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, rx_fcs_errors);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_control_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, rx_control_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, rx_control_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_pause_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, rx_pause_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, rx_pause_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_pfc_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, rx_pfc_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, rx_pfc_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_unsupported_opcode");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, rx_unsupported_opcode);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, rx_unsupported_opcode);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_unsupported_da");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, rx_unsupported_da);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, rx_unsupported_da);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_alignment_errors");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, rx_alignment_errors);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, rx_alignment_errors);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_length_out_of_range");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, rx_length_out_of_range);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, rx_length_out_of_range);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_code_errors");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, rx_code_errors);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, rx_code_errors);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_oversized_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, rx_oversized_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, rx_oversized_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_jabber_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, rx_jabber_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, rx_jabber_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_mtu_check_errors");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, rx_mtu_check_errors);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, rx_mtu_check_errors);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_promiscuous_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, rx_promiscuous_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, rx_promiscuous_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_vlan_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, rx_vlan_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, rx_vlan_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_double_vlan_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, rx_double_vlan_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, rx_double_vlan_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_truncated_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, rx_truncated_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, rx_truncated_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_undersize_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, rx_undersize_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, rx_undersize_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_fragmented_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, rx_fragmented_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, rx_fragmented_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_runt_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, rx_runt_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, rx_runt_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_frames_64");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, tx_frames_64);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, tx_frames_64);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_frames_65_127");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, tx_frames_65_127);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, tx_frames_65_127);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_frames_128_255");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, tx_frames_128_255);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, tx_frames_128_255);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_frames_256_511");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, tx_frames_256_511);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, tx_frames_256_511);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_frames_512_1023");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, tx_frames_512_1023);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, tx_frames_512_1023);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_frames_1024_1518");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, tx_frames_1024_1518);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, tx_frames_1024_1518);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_frames_1519_2047");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, tx_frames_1519_2047);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, tx_frames_1519_2047);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_frames_2048_4095");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, tx_frames_2048_4095);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, tx_frames_2048_4095);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_frames_4096_9216");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, tx_frames_4096_9216);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, tx_frames_4096_9216);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_frames_9217_16383");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, tx_frames_9217_16383);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, tx_frames_9217_16383);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, tx_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, tx_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_bytes");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, tx_bytes);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, tx_bytes);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_good_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, tx_good_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, tx_good_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_unicast_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, tx_unicast_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, tx_unicast_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_multicast_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, tx_multicast_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, tx_multicast_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_broadcast_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, tx_broadcast_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, tx_broadcast_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_pause_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, tx_pause_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, tx_pause_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_pfc_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, tx_pfc_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, tx_pfc_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_jabber_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, tx_jabber_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, tx_jabber_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_fcs_errors");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, tx_fcs_errors);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, tx_fcs_errors);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_control_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, tx_control_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, tx_control_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_oversize_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, tx_oversize_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, tx_oversize_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_fragmented_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, tx_fragmented_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, tx_fragmented_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_error_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, tx_error_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, tx_error_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_vlan_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, tx_vlan_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, tx_vlan_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_double_vlan_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, tx_double_vlan_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, tx_double_vlan_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_runt_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, tx_runt_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, tx_runt_frames);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_underrun_frames");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, nni, tx_underrun_frames);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, tx_underrun_frames);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_STAT_PROP_IS_SET(&stat, nni, rx_frames_64) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, rx_frames_65_127) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, rx_frames_128_255) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, rx_frames_256_511) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, rx_frames_512_1023) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, rx_frames_1024_1518) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, rx_frames_1519_2047) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, rx_frames_2048_4095) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, rx_frames_4096_9216) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, rx_frames_9217_16383) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, rx_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, rx_bytes) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, rx_good_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, rx_unicast_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, rx_multicast_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, rx_broadcast_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, rx_fcs_errors) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, rx_control_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, rx_pause_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, rx_pfc_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, rx_unsupported_opcode) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, rx_unsupported_da) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, rx_alignment_errors) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, rx_length_out_of_range) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, rx_code_errors) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, rx_oversized_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, rx_jabber_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, rx_mtu_check_errors) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, rx_promiscuous_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, rx_vlan_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, rx_double_vlan_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, rx_truncated_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, rx_undersize_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, rx_fragmented_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, rx_runt_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, tx_frames_64) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, tx_frames_65_127) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, tx_frames_128_255) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, tx_frames_256_511) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, tx_frames_512_1023) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, tx_frames_1024_1518) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, tx_frames_1519_2047) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, tx_frames_2048_4095) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, tx_frames_4096_9216) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, tx_frames_9217_16383) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, tx_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, tx_bytes) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, tx_good_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, tx_unicast_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, tx_multicast_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, tx_broadcast_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, tx_pause_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, tx_pfc_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, tx_jabber_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, tx_fcs_errors) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, tx_control_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, tx_oversize_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, tx_fragmented_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, tx_error_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, tx_vlan_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, tx_double_vlan_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, tx_runt_frames) && !BCMOLT_STAT_PROP_IS_SET(&stat, nni, tx_underrun_frames))
    {
        BCMOLT_STAT_PROP_GET(&stat, nni, all_properties);
        bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, nni, all_properties);\n");
    }

    /* call API */
    err = bcmolt_stat_get(device_id, &stat.hdr, clear_on_read);
    bcmcli_log("bcmolt_stat_get(device_id, &stat.hdr, clear_on_read);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &stat.hdr.hdr);
    }

    apicli_print_complete(session, err, stat.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_nni_stat_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_nni_stat_cfg stat_cfg;   /**< declare main API struct */
    bcmolt_nni_key key = { };       /**< declare key */
    bcmolt_nni_stat_id stat_id;     /**< declare stat ID */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_nni_stat_cfg stat_cfg;\n");
    bcmcli_log("bcmolt_nni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_stat_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_pon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_NNI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_NNI_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* set stat ID from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "sub");
    if (cli_parm != NULL)
    {
        stat_id = (bcmolt_nni_stat_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
        return BCM_ERR_PARM;
    }

    /* init the API struct */
    switch (stat_id)
    {
        case BCMOLT_NNI_STAT_ID_RX_FRAMES_64:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_frames_64, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_frames_64, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_FRAMES_65_127:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_frames_65_127, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_frames_65_127, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_FRAMES_128_255:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_frames_128_255, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_frames_128_255, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_FRAMES_256_511:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_frames_256_511, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_frames_256_511, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_FRAMES_512_1023:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_frames_512_1023, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_frames_512_1023, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_FRAMES_1024_1518:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_frames_1024_1518, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_frames_1024_1518, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_FRAMES_1519_2047:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_frames_1519_2047, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_frames_1519_2047, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_FRAMES_2048_4095:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_frames_2048_4095, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_frames_2048_4095, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_FRAMES_4096_9216:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_frames_4096_9216, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_frames_4096_9216, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_FRAMES_9217_16383:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_frames_9217_16383, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_frames_9217_16383, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_bytes, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_GOOD_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_good_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_good_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_UNICAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_unicast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_unicast_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_MULTICAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_multicast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_multicast_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_BROADCAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_broadcast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_broadcast_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_FCS_ERRORS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_fcs_errors, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_fcs_errors, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_CONTROL_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_control_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_control_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_PAUSE_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_pause_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_pause_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_PFC_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_pfc_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_pfc_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_UNSUPPORTED_OPCODE:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_unsupported_opcode, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_unsupported_opcode, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_UNSUPPORTED_DA:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_unsupported_da, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_unsupported_da, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_ALIGNMENT_ERRORS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_alignment_errors, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_alignment_errors, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_LENGTH_OUT_OF_RANGE:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_length_out_of_range, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_length_out_of_range, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_CODE_ERRORS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_code_errors, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_code_errors, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_OVERSIZED_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_oversized_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_oversized_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_JABBER_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_jabber_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_jabber_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_MTU_CHECK_ERRORS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_mtu_check_errors, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_mtu_check_errors, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_PROMISCUOUS_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_promiscuous_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_promiscuous_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_VLAN_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_vlan_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_vlan_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_DOUBLE_VLAN_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_double_vlan_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_double_vlan_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_TRUNCATED_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_truncated_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_truncated_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_UNDERSIZE_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_undersize_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_undersize_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_FRAGMENTED_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_fragmented_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_fragmented_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_RUNT_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_runt_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_runt_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_FRAMES_64:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_frames_64, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_frames_64, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_FRAMES_65_127:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_frames_65_127, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_frames_65_127, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_FRAMES_128_255:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_frames_128_255, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_frames_128_255, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_FRAMES_256_511:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_frames_256_511, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_frames_256_511, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_FRAMES_512_1023:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_frames_512_1023, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_frames_512_1023, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_FRAMES_1024_1518:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_frames_1024_1518, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_frames_1024_1518, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_FRAMES_1519_2047:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_frames_1519_2047, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_frames_1519_2047, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_FRAMES_2048_4095:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_frames_2048_4095, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_frames_2048_4095, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_FRAMES_4096_9216:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_frames_4096_9216, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_frames_4096_9216, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_FRAMES_9217_16383:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_frames_9217_16383, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_frames_9217_16383, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_bytes, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_GOOD_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_good_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_good_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_UNICAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_unicast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_unicast_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_MULTICAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_multicast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_multicast_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_BROADCAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_broadcast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_broadcast_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_PAUSE_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_pause_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_pause_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_PFC_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_pfc_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_pfc_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_JABBER_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_jabber_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_jabber_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_FCS_ERRORS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_fcs_errors, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_fcs_errors, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_CONTROL_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_control_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_control_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_OVERSIZE_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_oversize_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_oversize_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_FRAGMENTED_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_fragmented_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_fragmented_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_ERROR_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_error_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_error_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_VLAN_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_vlan_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_vlan_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_DOUBLE_VLAN_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_double_vlan_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_double_vlan_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_RUNT_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_runt_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_runt_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_UNDERRUN_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_underrun_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_underrun_frames, key);\n");
            break;
        default:
            apicli_print_complete(session, BCM_ERR_RANGE, "\n");
            return BCM_ERR_RANGE;
    }

    /* call API */
    err = bcmolt_stat_cfg_get(device_id, &stat_cfg.hdr);
    bcmcli_log("bcmolt_stat_cfg_get(device_id, &stat_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &stat_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, stat_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_nni_stat_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_nni_stat_cfg stat_cfg;   /**< declare main API struct */
    bcmolt_nni_key key = { };       /**< declare key */
    bcmolt_nni_stat_id stat_id;     /**< declare stat ID */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_nni_stat_cfg stat_cfg;\n");
    bcmcli_log("bcmolt_nni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_stat_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_pon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_NNI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_NNI_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* set stat ID from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "sub");
    if (cli_parm != NULL)
    {
        stat_id = (bcmolt_nni_stat_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
        return BCM_ERR_PARM;
    }

    /* init the API struct */
    switch (stat_id)
    {
        case BCMOLT_NNI_STAT_ID_RX_FRAMES_64:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_frames_64, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_frames_64, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_FRAMES_65_127:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_frames_65_127, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_frames_65_127, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_FRAMES_128_255:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_frames_128_255, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_frames_128_255, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_FRAMES_256_511:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_frames_256_511, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_frames_256_511, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_FRAMES_512_1023:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_frames_512_1023, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_frames_512_1023, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_FRAMES_1024_1518:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_frames_1024_1518, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_frames_1024_1518, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_FRAMES_1519_2047:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_frames_1519_2047, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_frames_1519_2047, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_FRAMES_2048_4095:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_frames_2048_4095, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_frames_2048_4095, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_FRAMES_4096_9216:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_frames_4096_9216, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_frames_4096_9216, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_FRAMES_9217_16383:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_frames_9217_16383, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_frames_9217_16383, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_bytes, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_GOOD_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_good_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_good_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_UNICAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_unicast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_unicast_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_MULTICAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_multicast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_multicast_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_BROADCAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_broadcast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_broadcast_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_FCS_ERRORS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_fcs_errors, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_fcs_errors, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_CONTROL_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_control_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_control_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_PAUSE_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_pause_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_pause_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_PFC_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_pfc_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_pfc_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_UNSUPPORTED_OPCODE:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_unsupported_opcode, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_unsupported_opcode, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_UNSUPPORTED_DA:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_unsupported_da, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_unsupported_da, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_ALIGNMENT_ERRORS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_alignment_errors, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_alignment_errors, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_LENGTH_OUT_OF_RANGE:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_length_out_of_range, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_length_out_of_range, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_CODE_ERRORS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_code_errors, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_code_errors, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_OVERSIZED_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_oversized_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_oversized_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_JABBER_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_jabber_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_jabber_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_MTU_CHECK_ERRORS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_mtu_check_errors, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_mtu_check_errors, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_PROMISCUOUS_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_promiscuous_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_promiscuous_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_VLAN_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_vlan_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_vlan_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_DOUBLE_VLAN_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_double_vlan_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_double_vlan_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_TRUNCATED_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_truncated_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_truncated_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_UNDERSIZE_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_undersize_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_undersize_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_FRAGMENTED_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_fragmented_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_fragmented_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_RX_RUNT_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_runt_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, rx_runt_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_FRAMES_64:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_frames_64, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_frames_64, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_FRAMES_65_127:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_frames_65_127, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_frames_65_127, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_FRAMES_128_255:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_frames_128_255, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_frames_128_255, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_FRAMES_256_511:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_frames_256_511, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_frames_256_511, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_FRAMES_512_1023:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_frames_512_1023, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_frames_512_1023, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_FRAMES_1024_1518:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_frames_1024_1518, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_frames_1024_1518, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_FRAMES_1519_2047:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_frames_1519_2047, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_frames_1519_2047, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_FRAMES_2048_4095:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_frames_2048_4095, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_frames_2048_4095, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_FRAMES_4096_9216:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_frames_4096_9216, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_frames_4096_9216, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_FRAMES_9217_16383:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_frames_9217_16383, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_frames_9217_16383, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_bytes, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_GOOD_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_good_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_good_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_UNICAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_unicast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_unicast_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_MULTICAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_multicast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_multicast_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_BROADCAST_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_broadcast_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_broadcast_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_PAUSE_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_pause_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_pause_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_PFC_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_pfc_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_pfc_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_JABBER_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_jabber_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_jabber_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_FCS_ERRORS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_fcs_errors, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_fcs_errors, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_CONTROL_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_control_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_control_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_OVERSIZE_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_oversize_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_oversize_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_FRAGMENTED_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_fragmented_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_fragmented_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_ERROR_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_error_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_error_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_VLAN_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_vlan_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_vlan_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_DOUBLE_VLAN_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_double_vlan_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_double_vlan_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_RUNT_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_runt_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_runt_frames, key);\n");
            break;
        case BCMOLT_NNI_STAT_ID_TX_UNDERRUN_FRAMES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_underrun_frames, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, nni, tx_underrun_frames, key);\n");
            break;
        default:
            apicli_print_complete(session, BCM_ERR_RANGE, "\n");
            return BCM_ERR_RANGE;
    }

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.");
    if (cli_parm != NULL)
    {
        bcmolt_stat_alarm_config val = { };
        cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.trigger.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.type");
            if (cli_parm != NULL)
            {
                val.trigger.type = (bcmolt_stat_condition_type) cli_parm->value.enum_val;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.type is not set\n");
                return BCM_ERR_PARM;
            }

            switch (val.trigger.type)
            {
                case BCMOLT_STAT_CONDITION_TYPE_RATE_THRESHOLD:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.rising");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_threshold.rising = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.rising is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.falling");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_threshold.falling = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.falling is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_RATE_RANGE:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.upper");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_range.upper = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.upper is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.lower");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_range.lower = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.lower is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_VALUE_THRESHOLD:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.limit");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.value_threshold.limit = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.limit is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_NONE:
                    break;
                default:
                    apicli_print_complete(session, BCM_ERR_RANGE, "\n");
                    return BCM_ERR_RANGE;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.soak.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "cfg.soak.active_soak_time");
            if (cli_parm != NULL)
            {
                val.soak.active_soak_time = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak.active_soak_time is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "cfg.soak.clear_soak_time");
            if (cli_parm != NULL)
            {
                val.soak.clear_soak_time = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak.clear_soak_time is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_STAT_CFG_PROP_SET(&stat_cfg, nni, cfg, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_stat_alarm_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI, BCMOLT_MGT_GROUP_STAT_CFG, 0, BCMOLT_NNI_STAT_CFG_ID_CFG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_STAT_CFG_PROP_SET(&stat_cfg, nni, cfg, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_stat_cfg_set(device_id, &stat_cfg.hdr);
    bcmcli_log("bcmolt_stat_cfg_set(device_id, &stat_cfg.hdr);\n");
    apicli_print_complete(session, err, stat_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_nni_auto_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_nni_auto_cfg auto_cfg;   /**< declare main API struct */
    bcmolt_nni_key key = { };       /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_nni_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_nni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_get");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, nni, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, nni, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_cleared");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, nni, stat_alarm_cleared);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, nni, stat_alarm_cleared);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_raised");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, nni, stat_alarm_raised);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, nni, stat_alarm_raised);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "status_changed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, nni, status_changed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, nni, status_changed);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, nni, stat_alarm_cleared) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, nni, stat_alarm_raised) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, nni, status_changed))
    {
        BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, nni, all_properties);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, nni, all_properties);\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &auto_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_nni_auto_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_nni_auto_cfg auto_cfg;   /**< declare main API struct */
    bcmolt_nni_key key = { };       /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_nni_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_nni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_set");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, nni, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, nni, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_cleared");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, nni, stat_alarm_cleared, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, nni, stat_alarm_cleared, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_NNI_AUTO_CFG_ID_STAT_ALARM_CLEARED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_raised");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, nni, stat_alarm_raised, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, nni, stat_alarm_raised, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_NNI_AUTO_CFG_ID_STAT_ALARM_RAISED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "status_changed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, nni, status_changed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, nni, status_changed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_NNI_AUTO_CFG_ID_STATUS_CHANGED, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);\n");
    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_nni_serdes_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_nni_serdes_cfg cfg;          /**< declare main API struct */
    bcmolt_nni_serdes_key key = { };    /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_nni_serdes_cfg cfg;\n");
    bcmcli_log("bcmolt_nni_serdes_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_pon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_NNI_SERDES, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_NNI_SERDES_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "instance");
    if (cli_parm != NULL)
    {
        key.instance = (bcmolt_serdes_instance) cli_parm->value.enum_val;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "instance is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.instance = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_NNI_SERDES, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_NNI_SERDES_KEY_ID_INSTANCE, &key.instance);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, nni_serdes, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, nni_serdes, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "rx_vga");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, nni_serdes, rx_vga);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, nni_serdes, rx_vga);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_pf");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, nni_serdes, rx_pf);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, nni_serdes, rx_pf);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_lfpf");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, nni_serdes, rx_lfpf);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, nni_serdes, rx_lfpf);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_dfe1");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, nni_serdes, rx_dfe1);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, nni_serdes, rx_dfe1);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_dfe2");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, nni_serdes, rx_dfe2);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, nni_serdes, rx_dfe2);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_dfe3");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, nni_serdes, rx_dfe3);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, nni_serdes, rx_dfe3);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_dfe4");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, nni_serdes, rx_dfe4);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, nni_serdes, rx_dfe4);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_dfe5");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, nni_serdes, rx_dfe5);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, nni_serdes, rx_dfe5);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_pre");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, nni_serdes, tx_pre);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, nni_serdes, tx_pre);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_main");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, nni_serdes, tx_main);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, nni_serdes, tx_main);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_post1");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, nni_serdes, tx_post1);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, nni_serdes, tx_post1);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_post2");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, nni_serdes, tx_post2);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, nni_serdes, tx_post2);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_post3");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, nni_serdes, tx_post3);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, nni_serdes, tx_post3);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_amp");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, nni_serdes, tx_amp);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, nni_serdes, tx_amp);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_CFG_PROP_IS_SET(&cfg, nni_serdes, rx_vga) && !BCMOLT_CFG_PROP_IS_SET(&cfg, nni_serdes, rx_pf) && !BCMOLT_CFG_PROP_IS_SET(&cfg, nni_serdes, rx_lfpf) && !BCMOLT_CFG_PROP_IS_SET(&cfg, nni_serdes, rx_dfe1) && !BCMOLT_CFG_PROP_IS_SET(&cfg, nni_serdes, rx_dfe2) && !BCMOLT_CFG_PROP_IS_SET(&cfg, nni_serdes, rx_dfe3) && !BCMOLT_CFG_PROP_IS_SET(&cfg, nni_serdes, rx_dfe4) && !BCMOLT_CFG_PROP_IS_SET(&cfg, nni_serdes, rx_dfe5) && !BCMOLT_CFG_PROP_IS_SET(&cfg, nni_serdes, tx_pre) && !BCMOLT_CFG_PROP_IS_SET(&cfg, nni_serdes, tx_main) && !BCMOLT_CFG_PROP_IS_SET(&cfg, nni_serdes, tx_post1) && !BCMOLT_CFG_PROP_IS_SET(&cfg, nni_serdes, tx_post2) && !BCMOLT_CFG_PROP_IS_SET(&cfg, nni_serdes, tx_post3) && !BCMOLT_CFG_PROP_IS_SET(&cfg, nni_serdes, tx_amp))
    {
        BCMOLT_CFG_PROP_GET(&cfg, nni_serdes, all_properties);
        bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, nni_serdes, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_get(device_id, &cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_nni_serdes_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_nni_serdes_cfg cfg;          /**< declare main API struct */
    bcmolt_nni_serdes_key key = { };    /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_nni_serdes_cfg cfg;\n");
    bcmcli_log("bcmolt_nni_serdes_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_pon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_NNI_SERDES, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_NNI_SERDES_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "instance");
    if (cli_parm != NULL)
    {
        key.instance = (bcmolt_serdes_instance) cli_parm->value.enum_val;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "instance is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.instance = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_NNI_SERDES, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_NNI_SERDES_KEY_ID_INSTANCE, &key.instance);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, nni_serdes, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, nni_serdes, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "rx_vga");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, rx_vga, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, rx_vga, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_NNI_SERDES_CFG_ID_RX_VGA, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_pf");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, rx_pf, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, rx_pf, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_NNI_SERDES_CFG_ID_RX_PF, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_lfpf");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, rx_lfpf, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, rx_lfpf, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_NNI_SERDES_CFG_ID_RX_LFPF, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_dfe1");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, rx_dfe1, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, rx_dfe1, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_NNI_SERDES_CFG_ID_RX_DFE1, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_dfe2");
    if (cli_parm != NULL)
    {
        int8_t val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, rx_dfe2, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, rx_dfe2, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_NNI_SERDES_CFG_ID_RX_DFE2, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_dfe3");
    if (cli_parm != NULL)
    {
        int8_t val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, rx_dfe3, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, rx_dfe3, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_NNI_SERDES_CFG_ID_RX_DFE3, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_dfe4");
    if (cli_parm != NULL)
    {
        int8_t val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, rx_dfe4, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, rx_dfe4, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_NNI_SERDES_CFG_ID_RX_DFE4, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_dfe5");
    if (cli_parm != NULL)
    {
        int8_t val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, rx_dfe5, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, rx_dfe5, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_NNI_SERDES_CFG_ID_RX_DFE5, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_pre");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, tx_pre, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, tx_pre, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_NNI_SERDES_CFG_ID_TX_PRE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_main");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, tx_main, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, tx_main, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_NNI_SERDES_CFG_ID_TX_MAIN, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_post1");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, tx_post1, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, tx_post1, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_NNI_SERDES_CFG_ID_TX_POST1, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_post2");
    if (cli_parm != NULL)
    {
        int8_t val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, tx_post2, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, tx_post2, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_NNI_SERDES_CFG_ID_TX_POST2, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_post3");
    if (cli_parm != NULL)
    {
        int8_t val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, tx_post3, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, tx_post3, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_NNI_SERDES_CFG_ID_TX_POST3, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_amp");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, tx_amp, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, tx_amp, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_NNI_SERDES_CFG_ID_TX_AMP, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_cfg_set(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_set(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_nni_serdes_cfg_clear(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_nni_serdes_cfg cfg;          /**< declare main API struct */
    bcmolt_nni_serdes_key key = { };    /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_nni_serdes_cfg cfg;\n");
    bcmcli_log("bcmolt_nni_serdes_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_clear");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_pon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_NNI_SERDES, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_NNI_SERDES_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "instance");
    if (cli_parm != NULL)
    {
        key.instance = (bcmolt_serdes_instance) cli_parm->value.enum_val;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "instance is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.instance = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_NNI_SERDES, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_NNI_SERDES_KEY_ID_INSTANCE, &key.instance);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, nni_serdes, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, nni_serdes, key);\n");

    /* call API */
    err = bcmolt_cfg_clear(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_clear(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_nni_serdes_cfg_get_multi(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_nni_serdes_cfg cfg;          /**< declare main API struct */
    bcmolt_nni_serdes_key key = { };    /**< declare key */
    bcmolt_msg_set *msg_set = NULL;     /**< declare message set */
    uint32_t max_msgs;                  /**< declare max number of msgs to get */
    bcmos_bool invert_filter;           /**< declare filter invert flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_nni_serdes_cfg cfg;\n");
    bcmcli_log("bcmolt_nni_serdes_key key = {  };\n");
    bcmcli_log("bcmolt_msg_set* msg_set = NULL;\n");
    bcmcli_log("uint32_t max_msgs;\n");
    bcmcli_log("bcmos_bool invert_filter;\n");
    apicli_print_start(session, "bcmolt_cfg_get_multi");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_pon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_NNI_SERDES, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_NNI_SERDES_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "instance");
    if (cli_parm != NULL)
    {
        key.instance = (bcmolt_serdes_instance) cli_parm->value.enum_val;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "instance is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.instance = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_NNI_SERDES, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_NNI_SERDES_KEY_ID_INSTANCE, &key.instance);
    bcmcli_log(";\n");

    /* set max number of msgs from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "max_msgs");
    if (cli_parm != NULL)
    {
        max_msgs = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "max_msgs is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("max_msgs = %d;\n", max_msgs);

    /* set filter invert flag from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "filter_invert");
    if (cli_parm != NULL)
    {
        invert_filter = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "filter_invert is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("invert_filter = %s;\n", (invert_filter) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* allocate message set */
    err = apicli_msg_set_alloc(byte_pool, BCMOLT_OBJ_ID_NNI_SERDES, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);
    if (err != BCM_ERR_OK)
    {
        return err;
    }

    bcmcli_log("bcmolt_msg_set_alloc(BCMOLT_OBJ_ID_NNI_SERDES, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, nni_serdes, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, nni_serdes, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "filter.rx_vga");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, rx_vga, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, rx_vga, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_NNI_SERDES_CFG_ID_RX_VGA, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_vga");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni_serdes, rx_vga);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni_serdes, rx_vga);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.rx_pf");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, rx_pf, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, rx_pf, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_NNI_SERDES_CFG_ID_RX_PF, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_pf");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni_serdes, rx_pf);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni_serdes, rx_pf);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.rx_lfpf");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, rx_lfpf, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, rx_lfpf, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_NNI_SERDES_CFG_ID_RX_LFPF, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_lfpf");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni_serdes, rx_lfpf);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni_serdes, rx_lfpf);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.rx_dfe1");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, rx_dfe1, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, rx_dfe1, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_NNI_SERDES_CFG_ID_RX_DFE1, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_dfe1");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni_serdes, rx_dfe1);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni_serdes, rx_dfe1);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.rx_dfe2");
    if (cli_parm != NULL)
    {
        int8_t val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, rx_dfe2, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, rx_dfe2, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_NNI_SERDES_CFG_ID_RX_DFE2, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_dfe2");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni_serdes, rx_dfe2);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni_serdes, rx_dfe2);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.rx_dfe3");
    if (cli_parm != NULL)
    {
        int8_t val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, rx_dfe3, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, rx_dfe3, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_NNI_SERDES_CFG_ID_RX_DFE3, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_dfe3");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni_serdes, rx_dfe3);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni_serdes, rx_dfe3);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.rx_dfe4");
    if (cli_parm != NULL)
    {
        int8_t val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, rx_dfe4, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, rx_dfe4, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_NNI_SERDES_CFG_ID_RX_DFE4, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_dfe4");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni_serdes, rx_dfe4);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni_serdes, rx_dfe4);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.rx_dfe5");
    if (cli_parm != NULL)
    {
        int8_t val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, rx_dfe5, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, rx_dfe5, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_NNI_SERDES_CFG_ID_RX_DFE5, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_dfe5");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni_serdes, rx_dfe5);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni_serdes, rx_dfe5);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.tx_pre");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, tx_pre, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, tx_pre, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_NNI_SERDES_CFG_ID_TX_PRE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_pre");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni_serdes, tx_pre);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni_serdes, tx_pre);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.tx_main");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, tx_main, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, tx_main, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_NNI_SERDES_CFG_ID_TX_MAIN, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_main");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni_serdes, tx_main);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni_serdes, tx_main);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.tx_post1");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, tx_post1, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, tx_post1, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_NNI_SERDES_CFG_ID_TX_POST1, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_post1");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni_serdes, tx_post1);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni_serdes, tx_post1);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.tx_post2");
    if (cli_parm != NULL)
    {
        int8_t val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, tx_post2, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, tx_post2, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_NNI_SERDES_CFG_ID_TX_POST2, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_post2");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni_serdes, tx_post2);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni_serdes, tx_post2);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.tx_post3");
    if (cli_parm != NULL)
    {
        int8_t val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, tx_post3, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, tx_post3, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_NNI_SERDES_CFG_ID_TX_POST3, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_post3");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni_serdes, tx_post3);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni_serdes, tx_post3);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.tx_amp");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, tx_amp, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, nni_serdes, tx_amp, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_NNI_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_NNI_SERDES_CFG_ID_TX_AMP, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_amp");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni_serdes, tx_amp);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni_serdes, tx_amp);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, nni_serdes, rx_vga) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, nni_serdes, rx_pf) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, nni_serdes, rx_lfpf) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, nni_serdes, rx_dfe1) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, nni_serdes, rx_dfe2) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, nni_serdes, rx_dfe3) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, nni_serdes, rx_dfe4) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, nni_serdes, rx_dfe5) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, nni_serdes, tx_pre) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, nni_serdes, tx_main) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, nni_serdes, tx_post1) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, nni_serdes, tx_post2) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, nni_serdes, tx_post3) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, nni_serdes, tx_amp))
    {
        BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni_serdes, all_properties);
        bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, nni_serdes, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);
    bcmcli_log("bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_software_error_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_software_error_cfg cfg;          /**< declare main API struct */
    bcmolt_software_error_key key = { };    /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_software_error_cfg cfg;\n");
    bcmcli_log("bcmolt_software_error_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "idx");
    if (cli_parm != NULL)
    {
        key.idx = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "idx is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.idx = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_SOFTWARE_ERROR, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_SOFTWARE_ERROR_KEY_ID_IDX, &key.idx);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, software_error, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, software_error, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "entry");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, software_error, entry);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, software_error, entry);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_CFG_PROP_IS_SET(&cfg, software_error, entry))
    {
        BCMOLT_CFG_PROP_GET(&cfg, software_error, all_properties);
        bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, software_error, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_get(device_id, &cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_software_error_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_software_error_cfg cfg;          /**< declare main API struct */
    bcmolt_software_error_key key = { };    /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_software_error_cfg cfg;\n");
    bcmcli_log("bcmolt_software_error_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "idx");
    if (cli_parm != NULL)
    {
        key.idx = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "idx is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.idx = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_SOFTWARE_ERROR, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_SOFTWARE_ERROR_KEY_ID_IDX, &key.idx);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, software_error, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, software_error, key);\n");

    /* decode API parameters from CLI */

    /* call API */
    err = bcmolt_cfg_set(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_set(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_software_error_cfg_clear(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_software_error_cfg cfg;          /**< declare main API struct */
    bcmolt_software_error_key key = { };    /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_software_error_cfg cfg;\n");
    bcmcli_log("bcmolt_software_error_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_clear");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "idx");
    if (cli_parm != NULL)
    {
        key.idx = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "idx is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.idx = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_SOFTWARE_ERROR, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_SOFTWARE_ERROR_KEY_ID_IDX, &key.idx);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, software_error, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, software_error, key);\n");

    /* call API */
    err = bcmolt_cfg_clear(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_clear(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_software_error_cfg_get_multi(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_software_error_cfg cfg;          /**< declare main API struct */
    bcmolt_software_error_key key = { };    /**< declare key */
    bcmolt_msg_set *msg_set = NULL;         /**< declare message set */
    uint32_t max_msgs;                      /**< declare max number of msgs to get */
    bcmos_bool invert_filter;               /**< declare filter invert flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_software_error_cfg cfg;\n");
    bcmcli_log("bcmolt_software_error_key key = {  };\n");
    bcmcli_log("bcmolt_msg_set* msg_set = NULL;\n");
    bcmcli_log("uint32_t max_msgs;\n");
    bcmcli_log("bcmos_bool invert_filter;\n");
    apicli_print_start(session, "bcmolt_cfg_get_multi");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "idx");
    if (cli_parm != NULL)
    {
        key.idx = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "idx is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.idx = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_SOFTWARE_ERROR, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_SOFTWARE_ERROR_KEY_ID_IDX, &key.idx);
    bcmcli_log(";\n");

    /* set max number of msgs from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "max_msgs");
    if (cli_parm != NULL)
    {
        max_msgs = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "max_msgs is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("max_msgs = %d;\n", max_msgs);

    /* set filter invert flag from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "filter_invert");
    if (cli_parm != NULL)
    {
        invert_filter = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "filter_invert is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("invert_filter = %s;\n", (invert_filter) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* allocate message set */
    err = apicli_msg_set_alloc(byte_pool, BCMOLT_OBJ_ID_SOFTWARE_ERROR, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);
    if (err != BCM_ERR_OK)
    {
        return err;
    }

    bcmcli_log("bcmolt_msg_set_alloc(BCMOLT_OBJ_ID_SOFTWARE_ERROR, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, software_error, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, software_error, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.entry.");
    if (cli_parm != NULL)
    {
        bcmolt_sw_error val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.entry.first_error_time_us");
        if (cli_parm != NULL)
        {
            val.first_error_time_us = cli_parm->value.unumber64;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.entry.first_error_time_us is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.entry.last_error_time_us");
        if (cli_parm != NULL)
        {
            val.last_error_time_us = cli_parm->value.unumber64;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.entry.last_error_time_us is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.entry.line_number");
        if (cli_parm != NULL)
        {
            val.line_number = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.entry.line_number is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.entry.error_counter");
        if (cli_parm != NULL)
        {
            val.error_counter = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.entry.error_counter is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.entry.instance");
        if (cli_parm != NULL)
        {
            val.instance = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.entry.instance is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.entry.filename");
        if (cli_parm != NULL)
        {
            snprintf(val.filename, 64, "%s", cli_parm->value.string);
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.entry.filename is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.entry.task_name");
        if (cli_parm != NULL)
        {
            snprintf(val.task_name, 64, "%s", cli_parm->value.string);
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.entry.task_name is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, software_error, entry, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_sw_error val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_SOFTWARE_ERROR, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_SOFTWARE_ERROR_CFG_ID_ENTRY, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, software_error, entry, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "entry");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, software_error, entry);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, software_error, entry);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, software_error, entry))
    {
        BCMOLT_MSGSET_CFG_PROP_GET(msg_set, software_error, all_properties);
        bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, software_error, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);
    bcmcli_log("bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_trx_calibration_oper_start_capture_window_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_trx_calibration_start_capture_window oper;   /**< declare main API struct */
    bcmolt_trx_calibration_key key = { };               /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_trx_calibration_start_capture_window oper;\n");
    bcmcli_log("bcmolt_trx_calibration_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, trx_calibration, start_capture_window, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, trx_calibration, start_capture_window, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_OPER_PROP_SET(&oper, trx_calibration, start_capture_window, pon_ni, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, trx_calibration, start_capture_window, pon_ni, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_TRX_CALIBRATION, BCMOLT_MGT_GROUP_OPER, BCMOLT_TRX_CALIBRATION_OPER_ID_START_CAPTURE_WINDOW, BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_PON_NI, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "trigger");
    if (cli_parm != NULL)
    {
        bcmolt_trx_calibration_trigger val;
        val = (bcmolt_trx_calibration_trigger) cli_parm->value.enum_val;
        BCMOLT_OPER_PROP_SET(&oper, trx_calibration, start_capture_window, trigger, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, trx_calibration, start_capture_window, trigger, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_TRX_CALIBRATION, BCMOLT_MGT_GROUP_OPER, BCMOLT_TRX_CALIBRATION_OPER_ID_START_CAPTURE_WINDOW, BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_TRIGGER, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "strobe");
    if (cli_parm != NULL)
    {
        bcmolt_capture_strobe_signal val;
        val = (bcmolt_capture_strobe_signal) cli_parm->value.enum_val;
        BCMOLT_OPER_PROP_SET(&oper, trx_calibration, start_capture_window, strobe, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, trx_calibration, start_capture_window, strobe, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_TRX_CALIBRATION, BCMOLT_MGT_GROUP_OPER, BCMOLT_TRX_CALIBRATION_OPER_ID_START_CAPTURE_WINDOW, BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_STROBE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "window_mode");
    if (cli_parm != NULL)
    {
        bcmolt_trx_calibration_window_mode val;
        val = (bcmolt_trx_calibration_window_mode) cli_parm->value.enum_val;
        BCMOLT_OPER_PROP_SET(&oper, trx_calibration, start_capture_window, window_mode, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, trx_calibration, start_capture_window, window_mode, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_TRX_CALIBRATION, BCMOLT_MGT_GROUP_OPER, BCMOLT_TRX_CALIBRATION_OPER_ID_START_CAPTURE_WINDOW, BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_WINDOW_MODE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        uint16_t val;
        val = cli_parm->value.unumber;
        BCMOLT_OPER_PROP_SET(&oper, trx_calibration, start_capture_window, onu_id, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, trx_calibration, start_capture_window, onu_id, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_TRX_CALIBRATION, BCMOLT_MGT_GROUP_OPER, BCMOLT_TRX_CALIBRATION_OPER_ID_START_CAPTURE_WINDOW, BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_ONU_ID, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "trigger_position");
    if (cli_parm != NULL)
    {
        bcmolt_trx_calibration_trigger_position val;
        val = (bcmolt_trx_calibration_trigger_position) cli_parm->value.enum_val;
        BCMOLT_OPER_PROP_SET(&oper, trx_calibration, start_capture_window, trigger_position, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, trx_calibration, start_capture_window, trigger_position, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_TRX_CALIBRATION, BCMOLT_MGT_GROUP_OPER, BCMOLT_TRX_CALIBRATION_OPER_ID_START_CAPTURE_WINDOW, BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_TRIGGER_POSITION, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "stop_due_to_corrupt_strobe");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_OPER_PROP_SET(&oper, trx_calibration, start_capture_window, stop_due_to_corrupt_strobe, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, trx_calibration, start_capture_window, stop_due_to_corrupt_strobe, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_TRX_CALIBRATION, BCMOLT_MGT_GROUP_OPER, BCMOLT_TRX_CALIBRATION_OPER_ID_START_CAPTURE_WINDOW, BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_STOP_DUE_TO_CORRUPT_STROBE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "start_offset");
    if (cli_parm != NULL)
    {
        uint16_t val;
        val = cli_parm->value.unumber;
        BCMOLT_OPER_PROP_SET(&oper, trx_calibration, start_capture_window, start_offset, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, trx_calibration, start_capture_window, start_offset, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_TRX_CALIBRATION, BCMOLT_MGT_GROUP_OPER, BCMOLT_TRX_CALIBRATION_OPER_ID_START_CAPTURE_WINDOW, BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_START_OFFSET, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "end_offset");
    if (cli_parm != NULL)
    {
        uint16_t val;
        val = cli_parm->value.unumber;
        BCMOLT_OPER_PROP_SET(&oper, trx_calibration, start_capture_window, end_offset, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, trx_calibration, start_capture_window, end_offset, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_TRX_CALIBRATION, BCMOLT_MGT_GROUP_OPER, BCMOLT_TRX_CALIBRATION_OPER_ID_START_CAPTURE_WINDOW, BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_END_OFFSET, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "number_of_cycles");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_OPER_PROP_SET(&oper, trx_calibration, start_capture_window, number_of_cycles, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, trx_calibration, start_capture_window, number_of_cycles, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_TRX_CALIBRATION, BCMOLT_MGT_GROUP_OPER, BCMOLT_TRX_CALIBRATION_OPER_ID_START_CAPTURE_WINDOW, BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_NUMBER_OF_CYCLES, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_trx_calibration_oper_stop_capture_window_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_trx_calibration_stop_capture_window oper;    /**< declare main API struct */
    bcmolt_trx_calibration_key key = { };               /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_trx_calibration_stop_capture_window oper;\n");
    bcmcli_log("bcmolt_trx_calibration_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, trx_calibration, stop_capture_window, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, trx_calibration, stop_capture_window, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_OPER_PROP_SET(&oper, trx_calibration, stop_capture_window, pon_ni, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, trx_calibration, stop_capture_window, pon_ni, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_TRX_CALIBRATION, BCMOLT_MGT_GROUP_OPER, BCMOLT_TRX_CALIBRATION_OPER_ID_STOP_CAPTURE_WINDOW, BCMOLT_TRX_CALIBRATION_STOP_CAPTURE_WINDOW_ID_PON_NI, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_trx_calibration_auto_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_trx_calibration_auto_cfg auto_cfg;   /**< declare main API struct */
    bcmolt_trx_calibration_key key = { };       /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_trx_calibration_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_trx_calibration_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_get");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, trx_calibration, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, trx_calibration, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "capture_window_and_statistic_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, trx_calibration, capture_window_and_statistic_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, trx_calibration, capture_window_and_statistic_completed);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, trx_calibration, capture_window_and_statistic_completed))
    {
        BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, trx_calibration, all_properties);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, trx_calibration, all_properties);\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &auto_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_trx_calibration_auto_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_trx_calibration_auto_cfg auto_cfg;   /**< declare main API struct */
    bcmolt_trx_calibration_key key = { };       /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_trx_calibration_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_trx_calibration_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_set");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, trx_calibration, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, trx_calibration, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "capture_window_and_statistic_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, trx_calibration, capture_window_and_statistic_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, trx_calibration, capture_window_and_statistic_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_TRX_CALIBRATION, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_TRX_CALIBRATION_AUTO_CFG_ID_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);\n");
    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_alloc_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_alloc_cfg cfg;         /**< declare main API struct */
    bcmolt_xgpon_alloc_key key = { };   /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_alloc_cfg cfg;\n");
    bcmcli_log("bcmolt_xgpon_alloc_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ALLOC, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ALLOC_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "alloc_id");
    if (cli_parm != NULL)
    {
        key.alloc_id = (bcmolt_xgpon_alloc_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "alloc_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.alloc_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ALLOC, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ALLOC_KEY_ID_ALLOC_ID, &key.alloc_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, xgpon_alloc, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, xgpon_alloc, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "state");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_alloc, state);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_alloc, state);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "sla");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_alloc, sla);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_alloc, sla);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_alloc, onu_id);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_alloc, onu_id);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "collect_stats");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_alloc, collect_stats);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_alloc, collect_stats);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_alloc, state) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_alloc, sla) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_alloc, onu_id) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_alloc, collect_stats))
    {
        BCMOLT_CFG_PROP_GET(&cfg, xgpon_alloc, all_properties);
        bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_alloc, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_get(device_id, &cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_alloc_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_alloc_cfg cfg;         /**< declare main API struct */
    bcmolt_xgpon_alloc_key key = { };   /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_alloc_cfg cfg;\n");
    bcmcli_log("bcmolt_xgpon_alloc_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ALLOC, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ALLOC_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "alloc_id");
    if (cli_parm != NULL)
    {
        key.alloc_id = (bcmolt_xgpon_alloc_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "alloc_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.alloc_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ALLOC, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ALLOC_KEY_ID_ALLOC_ID, &key.alloc_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, xgpon_alloc, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, xgpon_alloc, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_parm_by_prefix(session, "sla.");
    if (cli_parm != NULL)
    {
        bcmolt_pon_alloc_sla val = { };
        cli_parm = bcmcli_find_named_parm(session, "sla.cbr_rt_bw");
        if (cli_parm != NULL)
        {
            val.cbr_rt_bw = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "sla.cbr_rt_bw is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "sla.cbr_nrt_bw");
        if (cli_parm != NULL)
        {
            val.cbr_nrt_bw = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "sla.cbr_nrt_bw is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "sla.guaranteed_bw");
        if (cli_parm != NULL)
        {
            val.guaranteed_bw = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "sla.guaranteed_bw is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "sla.maximum_bw");
        if (cli_parm != NULL)
        {
            val.maximum_bw = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "sla.maximum_bw is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "sla.additional_bw_eligibility");
        if (cli_parm != NULL)
        {
            val.additional_bw_eligibility = (bcmolt_additional_bw_eligibility) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "sla.additional_bw_eligibility is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "sla.cbr_rt_compensation");
        if (cli_parm != NULL)
        {
            val.cbr_rt_compensation = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "sla.cbr_rt_compensation is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "sla.cbr_rt_ap_index");
        if (cli_parm != NULL)
        {
            val.cbr_rt_ap_index = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "sla.cbr_rt_ap_index is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "sla.cbr_nrt_ap_index");
        if (cli_parm != NULL)
        {
            val.cbr_nrt_ap_index = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "sla.cbr_nrt_ap_index is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "sla.alloc_type");
        if (cli_parm != NULL)
        {
            val.alloc_type = (bcmolt_alloc_type) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "sla.alloc_type is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "sla.weight");
        if (cli_parm != NULL)
        {
            val.weight = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "sla.weight is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "sla.priority");
        if (cli_parm != NULL)
        {
            val.priority = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "sla.priority is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_alloc, sla, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_pon_alloc_sla val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ALLOC, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_ALLOC_CFG_ID_SLA, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_alloc, sla, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_onu_id val;
        val = (bcmolt_xgpon_onu_id) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_alloc, onu_id, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_alloc, onu_id, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ALLOC, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_ALLOC_CFG_ID_ONU_ID, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "collect_stats");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_alloc, collect_stats, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_alloc, collect_stats, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ALLOC, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_ALLOC_CFG_ID_COLLECT_STATS, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_cfg_set(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_set(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_alloc_cfg_clear(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_alloc_cfg cfg;         /**< declare main API struct */
    bcmolt_xgpon_alloc_key key = { };   /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_alloc_cfg cfg;\n");
    bcmcli_log("bcmolt_xgpon_alloc_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_clear");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ALLOC, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ALLOC_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "alloc_id");
    if (cli_parm != NULL)
    {
        key.alloc_id = (bcmolt_xgpon_alloc_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "alloc_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.alloc_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ALLOC, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ALLOC_KEY_ID_ALLOC_ID, &key.alloc_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, xgpon_alloc, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, xgpon_alloc, key);\n");

    /* call API */
    err = bcmolt_cfg_clear(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_clear(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_alloc_cfg_get_multi(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_alloc_cfg cfg;         /**< declare main API struct */
    bcmolt_xgpon_alloc_key key = { };   /**< declare key */
    bcmolt_msg_set *msg_set = NULL;     /**< declare message set */
    uint32_t max_msgs;                  /**< declare max number of msgs to get */
    bcmos_bool invert_filter;           /**< declare filter invert flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_alloc_cfg cfg;\n");
    bcmcli_log("bcmolt_xgpon_alloc_key key = {  };\n");
    bcmcli_log("bcmolt_msg_set* msg_set = NULL;\n");
    bcmcli_log("uint32_t max_msgs;\n");
    bcmcli_log("bcmos_bool invert_filter;\n");
    apicli_print_start(session, "bcmolt_cfg_get_multi");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ALLOC, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ALLOC_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "alloc_id");
    if (cli_parm != NULL)
    {
        key.alloc_id = (bcmolt_xgpon_alloc_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "alloc_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.alloc_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ALLOC, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ALLOC_KEY_ID_ALLOC_ID, &key.alloc_id);
    bcmcli_log(";\n");

    /* set max number of msgs from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "max_msgs");
    if (cli_parm != NULL)
    {
        max_msgs = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "max_msgs is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("max_msgs = %d;\n", max_msgs);

    /* set filter invert flag from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "filter_invert");
    if (cli_parm != NULL)
    {
        invert_filter = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "filter_invert is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("invert_filter = %s;\n", (invert_filter) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* allocate message set */
    err = apicli_msg_set_alloc(byte_pool, BCMOLT_OBJ_ID_XGPON_ALLOC, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);
    if (err != BCM_ERR_OK)
    {
        return err;
    }

    bcmcli_log("bcmolt_msg_set_alloc(BCMOLT_OBJ_ID_XGPON_ALLOC, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, xgpon_alloc, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, xgpon_alloc, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "filter.state");
    if (cli_parm != NULL)
    {
        bcmolt_alloc_state val;
        val = (bcmolt_alloc_state) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_alloc, state, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_alloc, state, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ALLOC, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_ALLOC_CFG_ID_STATE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "state");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_alloc, state);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_alloc, state);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.sla.");
    if (cli_parm != NULL)
    {
        bcmolt_pon_alloc_sla val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.sla.cbr_rt_bw");
        if (cli_parm != NULL)
        {
            val.cbr_rt_bw = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.sla.cbr_rt_bw is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.sla.cbr_nrt_bw");
        if (cli_parm != NULL)
        {
            val.cbr_nrt_bw = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.sla.cbr_nrt_bw is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.sla.guaranteed_bw");
        if (cli_parm != NULL)
        {
            val.guaranteed_bw = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.sla.guaranteed_bw is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.sla.maximum_bw");
        if (cli_parm != NULL)
        {
            val.maximum_bw = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.sla.maximum_bw is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.sla.additional_bw_eligibility");
        if (cli_parm != NULL)
        {
            val.additional_bw_eligibility = (bcmolt_additional_bw_eligibility) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.sla.additional_bw_eligibility is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.sla.cbr_rt_compensation");
        if (cli_parm != NULL)
        {
            val.cbr_rt_compensation = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.sla.cbr_rt_compensation is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.sla.cbr_rt_ap_index");
        if (cli_parm != NULL)
        {
            val.cbr_rt_ap_index = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.sla.cbr_rt_ap_index is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.sla.cbr_nrt_ap_index");
        if (cli_parm != NULL)
        {
            val.cbr_nrt_ap_index = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.sla.cbr_nrt_ap_index is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.sla.alloc_type");
        if (cli_parm != NULL)
        {
            val.alloc_type = (bcmolt_alloc_type) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.sla.alloc_type is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.sla.weight");
        if (cli_parm != NULL)
        {
            val.weight = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.sla.weight is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.sla.priority");
        if (cli_parm != NULL)
        {
            val.priority = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.sla.priority is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_alloc, sla, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_pon_alloc_sla val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ALLOC, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_ALLOC_CFG_ID_SLA, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_alloc, sla, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "sla");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_alloc, sla);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_alloc, sla);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.onu_id");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_onu_id val;
        val = (bcmolt_xgpon_onu_id) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_alloc, onu_id, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_alloc, onu_id, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ALLOC, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_ALLOC_CFG_ID_ONU_ID, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_alloc, onu_id);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_alloc, onu_id);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.collect_stats");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_alloc, collect_stats, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_alloc, collect_stats, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ALLOC, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_ALLOC_CFG_ID_COLLECT_STATS, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "collect_stats");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_alloc, collect_stats);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_alloc, collect_stats);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_alloc, state) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_alloc, sla) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_alloc, onu_id) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_alloc, collect_stats))
    {
        BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_alloc, all_properties);
        bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_alloc, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);
    bcmcli_log("bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_alloc_oper_get_stats_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_alloc_get_stats oper;  /**< declare main API struct */
    bcmolt_xgpon_alloc_key key = { };   /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_alloc_get_stats oper;\n");
    bcmcli_log("bcmolt_xgpon_alloc_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ALLOC, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ALLOC_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "alloc_id");
    if (cli_parm != NULL)
    {
        key.alloc_id = (bcmolt_xgpon_alloc_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "alloc_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.alloc_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ALLOC, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ALLOC_KEY_ID_ALLOC_ID, &key.alloc_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, xgpon_alloc, get_stats, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, xgpon_alloc, get_stats, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "num_of_cycles");
    if (cli_parm != NULL)
    {
        uint32_t val;
        val = cli_parm->value.unumber;
        BCMOLT_OPER_PROP_SET(&oper, xgpon_alloc, get_stats, num_of_cycles, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, xgpon_alloc, get_stats, num_of_cycles, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ALLOC, BCMOLT_MGT_GROUP_OPER, BCMOLT_XGPON_ALLOC_OPER_ID_GET_STATS, BCMOLT_XGPON_ALLOC_GET_STATS_ID_NUM_OF_CYCLES, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_alloc_oper_set_state_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_alloc_set_state oper;  /**< declare main API struct */
    bcmolt_xgpon_alloc_key key = { };   /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_alloc_set_state oper;\n");
    bcmcli_log("bcmolt_xgpon_alloc_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ALLOC, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ALLOC_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "alloc_id");
    if (cli_parm != NULL)
    {
        key.alloc_id = (bcmolt_xgpon_alloc_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "alloc_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.alloc_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ALLOC, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ALLOC_KEY_ID_ALLOC_ID, &key.alloc_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, xgpon_alloc, set_state, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, xgpon_alloc, set_state, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "state");
    if (cli_parm != NULL)
    {
        bcmolt_alloc_operation val;
        val = (bcmolt_alloc_operation) cli_parm->value.enum_val;
        BCMOLT_OPER_PROP_SET(&oper, xgpon_alloc, set_state, state, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, xgpon_alloc, set_state, state, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ALLOC, BCMOLT_MGT_GROUP_OPER, BCMOLT_XGPON_ALLOC_OPER_ID_SET_STATE, BCMOLT_XGPON_ALLOC_SET_STATE_ID_STATE, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_alloc_stat_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_alloc_stat stat;       /**< declare main API struct */
    bcmolt_xgpon_alloc_key key = { };   /**< declare key */
    bcmos_bool clear_on_read;           /**< declare 'clear on read' flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_alloc_stat stat;\n");
    bcmcli_log("bcmolt_xgpon_alloc_key key = {  };\n");
    bcmcli_log("bcmos_bool clear_on_read;\n");
    apicli_print_start(session, "bcmolt_stat_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ALLOC, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ALLOC_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "alloc_id");
    if (cli_parm != NULL)
    {
        key.alloc_id = (bcmolt_xgpon_alloc_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "alloc_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.alloc_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ALLOC, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ALLOC_KEY_ID_ALLOC_ID, &key.alloc_id);
    bcmcli_log(";\n");

    /* set stat flags from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "clear");
    if (cli_parm != NULL)
    {
        clear_on_read = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "clear is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("clear_on_read = %s;\n", (clear_on_read) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* init the API struct */
    BCMOLT_STAT_INIT(&stat, xgpon_alloc, key);
    bcmcli_log("BCMOLT_STAT_INIT(&stat, xgpon_alloc, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "rx_bytes");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_alloc, rx_bytes);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_alloc, rx_bytes);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_alloc, rx_bytes))
    {
        BCMOLT_STAT_PROP_GET(&stat, xgpon_alloc, all_properties);
        bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_alloc, all_properties);\n");
    }

    /* call API */
    err = bcmolt_stat_get(device_id, &stat.hdr, clear_on_read);
    bcmcli_log("bcmolt_stat_get(device_id, &stat.hdr, clear_on_read);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &stat.hdr.hdr);
    }

    apicli_print_complete(session, err, stat.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_alloc_stat_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_alloc_stat_cfg stat_cfg;   /**< declare main API struct */
    bcmolt_xgpon_alloc_key key = { };       /**< declare key */
    bcmolt_xgpon_alloc_stat_id stat_id;     /**< declare stat ID */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_alloc_stat_cfg stat_cfg;\n");
    bcmcli_log("bcmolt_xgpon_alloc_key key = {  };\n");
    apicli_print_start(session, "bcmolt_stat_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ALLOC, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ALLOC_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "alloc_id");
    if (cli_parm != NULL)
    {
        key.alloc_id = (bcmolt_xgpon_alloc_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "alloc_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.alloc_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ALLOC, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ALLOC_KEY_ID_ALLOC_ID, &key.alloc_id);
    bcmcli_log(";\n");

    /* set stat ID from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "sub");
    if (cli_parm != NULL)
    {
        stat_id = (bcmolt_xgpon_alloc_stat_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
        return BCM_ERR_PARM;
    }

    /* init the API struct */
    switch (stat_id)
    {
        case BCMOLT_XGPON_ALLOC_STAT_ID_RX_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_alloc, rx_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_alloc, rx_bytes, key);\n");
            break;
        default:
            apicli_print_complete(session, BCM_ERR_RANGE, "\n");
            return BCM_ERR_RANGE;
    }

    /* call API */
    err = bcmolt_stat_cfg_get(device_id, &stat_cfg.hdr);
    bcmcli_log("bcmolt_stat_cfg_get(device_id, &stat_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &stat_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, stat_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_alloc_stat_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_alloc_stat_cfg stat_cfg;   /**< declare main API struct */
    bcmolt_xgpon_alloc_key key = { };       /**< declare key */
    bcmolt_xgpon_alloc_stat_id stat_id;     /**< declare stat ID */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_alloc_stat_cfg stat_cfg;\n");
    bcmcli_log("bcmolt_xgpon_alloc_key key = {  };\n");
    apicli_print_start(session, "bcmolt_stat_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ALLOC, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ALLOC_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "alloc_id");
    if (cli_parm != NULL)
    {
        key.alloc_id = (bcmolt_xgpon_alloc_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "alloc_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.alloc_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ALLOC, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ALLOC_KEY_ID_ALLOC_ID, &key.alloc_id);
    bcmcli_log(";\n");

    /* set stat ID from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "sub");
    if (cli_parm != NULL)
    {
        stat_id = (bcmolt_xgpon_alloc_stat_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
        return BCM_ERR_PARM;
    }

    /* init the API struct */
    switch (stat_id)
    {
        case BCMOLT_XGPON_ALLOC_STAT_ID_RX_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_alloc, rx_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_alloc, rx_bytes, key);\n");
            break;
        default:
            apicli_print_complete(session, BCM_ERR_RANGE, "\n");
            return BCM_ERR_RANGE;
    }

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.");
    if (cli_parm != NULL)
    {
        bcmolt_stat_alarm_config val = { };
        cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.trigger.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.type");
            if (cli_parm != NULL)
            {
                val.trigger.type = (bcmolt_stat_condition_type) cli_parm->value.enum_val;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.type is not set\n");
                return BCM_ERR_PARM;
            }

            switch (val.trigger.type)
            {
                case BCMOLT_STAT_CONDITION_TYPE_RATE_THRESHOLD:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.rising");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_threshold.rising = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.rising is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.falling");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_threshold.falling = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.falling is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_RATE_RANGE:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.upper");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_range.upper = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.upper is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.lower");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_range.lower = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.lower is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_VALUE_THRESHOLD:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.limit");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.value_threshold.limit = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.limit is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_NONE:
                    break;
                default:
                    apicli_print_complete(session, BCM_ERR_RANGE, "\n");
                    return BCM_ERR_RANGE;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.soak.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "cfg.soak.active_soak_time");
            if (cli_parm != NULL)
            {
                val.soak.active_soak_time = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak.active_soak_time is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "cfg.soak.clear_soak_time");
            if (cli_parm != NULL)
            {
                val.soak.clear_soak_time = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak.clear_soak_time is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_STAT_CFG_PROP_SET(&stat_cfg, xgpon_alloc, cfg, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_stat_alarm_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ALLOC, BCMOLT_MGT_GROUP_STAT_CFG, 0, BCMOLT_XGPON_ALLOC_STAT_CFG_ID_CFG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_STAT_CFG_PROP_SET(&stat_cfg, xgpon_alloc, cfg, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_stat_cfg_set(device_id, &stat_cfg.hdr);
    bcmcli_log("bcmolt_stat_cfg_set(device_id, &stat_cfg.hdr);\n");
    apicli_print_complete(session, err, stat_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_alloc_auto_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_alloc_auto_cfg auto_cfg;   /**< declare main API struct */
    bcmolt_xgpon_alloc_key key = { };       /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_alloc_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_xgpon_alloc_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_get");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, xgpon_alloc, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, xgpon_alloc, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "configuration_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_alloc, configuration_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_alloc, configuration_completed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "get_alloc_stats_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_alloc, get_alloc_stats_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_alloc, get_alloc_stats_completed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_cleared");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_alloc, stat_alarm_cleared);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_alloc, stat_alarm_cleared);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_raised");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_alloc, stat_alarm_raised);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_alloc, stat_alarm_raised);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_alloc, configuration_completed) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_alloc, get_alloc_stats_completed) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_alloc, stat_alarm_cleared) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_alloc, stat_alarm_raised))
    {
        BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_alloc, all_properties);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_alloc, all_properties);\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &auto_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_alloc_auto_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_alloc_auto_cfg auto_cfg;   /**< declare main API struct */
    bcmolt_xgpon_alloc_key key = { };       /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_alloc_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_xgpon_alloc_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_set");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, xgpon_alloc, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, xgpon_alloc, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "configuration_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_alloc, configuration_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_alloc, configuration_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ALLOC, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_ALLOC_AUTO_CFG_ID_CONFIGURATION_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "get_alloc_stats_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_alloc, get_alloc_stats_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_alloc, get_alloc_stats_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ALLOC, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_ALLOC_AUTO_CFG_ID_GET_ALLOC_STATS_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_cleared");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_alloc, stat_alarm_cleared, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_alloc, stat_alarm_cleared, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ALLOC, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_ALLOC_AUTO_CFG_ID_STAT_ALARM_CLEARED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_raised");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_alloc, stat_alarm_raised, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_alloc, stat_alarm_raised, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ALLOC, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_ALLOC_AUTO_CFG_ID_STAT_ALARM_RAISED, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);\n");
    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_gem_port_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_gem_port_cfg cfg;          /**< declare main API struct */
    bcmolt_xgpon_gem_port_key key = { };    /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_gem_port_cfg cfg;\n");
    bcmcli_log("bcmolt_xgpon_gem_port_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_GEM_PORT, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_GEM_PORT_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "gem_port_id");
    if (cli_parm != NULL)
    {
        key.gem_port_id = (bcmolt_xgpon_gem_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "gem_port_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.gem_port_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_GEM_PORT, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_GEM_PORT_KEY_ID_GEM_PORT_ID, &key.gem_port_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, xgpon_gem_port, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, xgpon_gem_port, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "configuration");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_gem_port, configuration);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_gem_port, configuration);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_gem_port, onu_id);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_gem_port, onu_id);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "gem_port_state");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_gem_port, gem_port_state);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_gem_port, gem_port_state);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "encryption_mode");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_gem_port, encryption_mode);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_gem_port, encryption_mode);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "upstream_destination_queue");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_gem_port, upstream_destination_queue);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_gem_port, upstream_destination_queue);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "control");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_gem_port, control);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_gem_port, control);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_gem_port, configuration) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_gem_port, onu_id) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_gem_port, gem_port_state) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_gem_port, encryption_mode) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_gem_port, upstream_destination_queue) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_gem_port, control))
    {
        BCMOLT_CFG_PROP_GET(&cfg, xgpon_gem_port, all_properties);
        bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_gem_port, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_get(device_id, &cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_gem_port_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_gem_port_cfg cfg;          /**< declare main API struct */
    bcmolt_xgpon_gem_port_key key = { };    /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_gem_port_cfg cfg;\n");
    bcmcli_log("bcmolt_xgpon_gem_port_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_GEM_PORT, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_GEM_PORT_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "gem_port_id");
    if (cli_parm != NULL)
    {
        key.gem_port_id = (bcmolt_xgpon_gem_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "gem_port_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.gem_port_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_GEM_PORT, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_GEM_PORT_KEY_ID_GEM_PORT_ID, &key.gem_port_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, xgpon_gem_port, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, xgpon_gem_port, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_parm_by_prefix(session, "configuration.");
    if (cli_parm != NULL)
    {
        bcmolt_gem_port_configuration val = { };
        cli_parm = bcmcli_find_named_parm(session, "configuration.direction");
        if (cli_parm != NULL)
        {
            val.direction = (bcmolt_gem_port_direction) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "configuration.direction is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "configuration.type");
        if (cli_parm != NULL)
        {
            val.type = (bcmolt_gem_port_type) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "configuration.type is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_gem_port, configuration, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_gem_port_configuration val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_GEM_PORT, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_GEM_PORT_CFG_ID_CONFIGURATION, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_gem_port, configuration, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_onu_id val;
        val = (bcmolt_xgpon_onu_id) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_gem_port, onu_id, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_gem_port, onu_id, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_GEM_PORT, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_GEM_PORT_CFG_ID_ONU_ID, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "encryption_mode");
    if (cli_parm != NULL)
    {
        bcmolt_control_state val;
        val = (bcmolt_control_state) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_gem_port, encryption_mode, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_gem_port, encryption_mode, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_GEM_PORT, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_GEM_PORT_CFG_ID_ENCRYPTION_MODE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "upstream_destination_queue");
    if (cli_parm != NULL)
    {
        bcmolt_us_gem_port_destination val;
        val = (bcmolt_us_gem_port_destination) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_gem_port, upstream_destination_queue, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_gem_port, upstream_destination_queue, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_GEM_PORT, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_GEM_PORT_CFG_ID_UPSTREAM_DESTINATION_QUEUE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "control");
    if (cli_parm != NULL)
    {
        bcmolt_control_state val;
        val = (bcmolt_control_state) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_gem_port, control, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_gem_port, control, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_GEM_PORT, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_GEM_PORT_CFG_ID_CONTROL, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_cfg_set(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_set(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_gem_port_cfg_clear(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_gem_port_cfg cfg;          /**< declare main API struct */
    bcmolt_xgpon_gem_port_key key = { };    /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_gem_port_cfg cfg;\n");
    bcmcli_log("bcmolt_xgpon_gem_port_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_clear");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_GEM_PORT, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_GEM_PORT_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "gem_port_id");
    if (cli_parm != NULL)
    {
        key.gem_port_id = (bcmolt_xgpon_gem_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "gem_port_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.gem_port_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_GEM_PORT, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_GEM_PORT_KEY_ID_GEM_PORT_ID, &key.gem_port_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, xgpon_gem_port, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, xgpon_gem_port, key);\n");

    /* call API */
    err = bcmolt_cfg_clear(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_clear(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_gem_port_cfg_get_multi(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_gem_port_cfg cfg;          /**< declare main API struct */
    bcmolt_xgpon_gem_port_key key = { };    /**< declare key */
    bcmolt_msg_set *msg_set = NULL;         /**< declare message set */
    uint32_t max_msgs;                      /**< declare max number of msgs to get */
    bcmos_bool invert_filter;               /**< declare filter invert flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_gem_port_cfg cfg;\n");
    bcmcli_log("bcmolt_xgpon_gem_port_key key = {  };\n");
    bcmcli_log("bcmolt_msg_set* msg_set = NULL;\n");
    bcmcli_log("uint32_t max_msgs;\n");
    bcmcli_log("bcmos_bool invert_filter;\n");
    apicli_print_start(session, "bcmolt_cfg_get_multi");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_GEM_PORT, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_GEM_PORT_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "gem_port_id");
    if (cli_parm != NULL)
    {
        key.gem_port_id = (bcmolt_xgpon_gem_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "gem_port_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.gem_port_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_GEM_PORT, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_GEM_PORT_KEY_ID_GEM_PORT_ID, &key.gem_port_id);
    bcmcli_log(";\n");

    /* set max number of msgs from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "max_msgs");
    if (cli_parm != NULL)
    {
        max_msgs = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "max_msgs is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("max_msgs = %d;\n", max_msgs);

    /* set filter invert flag from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "filter_invert");
    if (cli_parm != NULL)
    {
        invert_filter = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "filter_invert is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("invert_filter = %s;\n", (invert_filter) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* allocate message set */
    err = apicli_msg_set_alloc(byte_pool, BCMOLT_OBJ_ID_XGPON_GEM_PORT, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);
    if (err != BCM_ERR_OK)
    {
        return err;
    }

    bcmcli_log("bcmolt_msg_set_alloc(BCMOLT_OBJ_ID_XGPON_GEM_PORT, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, xgpon_gem_port, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, xgpon_gem_port, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.configuration.");
    if (cli_parm != NULL)
    {
        bcmolt_gem_port_configuration val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.configuration.direction");
        if (cli_parm != NULL)
        {
            val.direction = (bcmolt_gem_port_direction) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.configuration.direction is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.configuration.type");
        if (cli_parm != NULL)
        {
            val.type = (bcmolt_gem_port_type) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.configuration.type is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_gem_port, configuration, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_gem_port_configuration val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_GEM_PORT, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_GEM_PORT_CFG_ID_CONFIGURATION, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_gem_port, configuration, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "configuration");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_gem_port, configuration);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_gem_port, configuration);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.onu_id");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_onu_id val;
        val = (bcmolt_xgpon_onu_id) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_gem_port, onu_id, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_gem_port, onu_id, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_GEM_PORT, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_GEM_PORT_CFG_ID_ONU_ID, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_gem_port, onu_id);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_gem_port, onu_id);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.gem_port_state");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_gem_port_state val;
        val = (bcmolt_xgpon_gem_port_state) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_gem_port, gem_port_state, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_gem_port, gem_port_state, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_GEM_PORT, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_GEM_PORT_CFG_ID_GEM_PORT_STATE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "gem_port_state");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_gem_port, gem_port_state);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_gem_port, gem_port_state);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.encryption_mode");
    if (cli_parm != NULL)
    {
        bcmolt_control_state val;
        val = (bcmolt_control_state) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_gem_port, encryption_mode, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_gem_port, encryption_mode, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_GEM_PORT, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_GEM_PORT_CFG_ID_ENCRYPTION_MODE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "encryption_mode");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_gem_port, encryption_mode);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_gem_port, encryption_mode);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.upstream_destination_queue");
    if (cli_parm != NULL)
    {
        bcmolt_us_gem_port_destination val;
        val = (bcmolt_us_gem_port_destination) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_gem_port, upstream_destination_queue, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_gem_port, upstream_destination_queue, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_GEM_PORT, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_GEM_PORT_CFG_ID_UPSTREAM_DESTINATION_QUEUE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "upstream_destination_queue");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_gem_port, upstream_destination_queue);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_gem_port, upstream_destination_queue);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.control");
    if (cli_parm != NULL)
    {
        bcmolt_control_state val;
        val = (bcmolt_control_state) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_gem_port, control, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_gem_port, control, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_GEM_PORT, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_GEM_PORT_CFG_ID_CONTROL, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "control");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_gem_port, control);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_gem_port, control);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_gem_port, configuration) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_gem_port, onu_id) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_gem_port, gem_port_state) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_gem_port, encryption_mode) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_gem_port, upstream_destination_queue) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_gem_port, control))
    {
        BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_gem_port, all_properties);
        bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_gem_port, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);
    bcmcli_log("bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_gem_port_stat_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_gem_port_stat stat;        /**< declare main API struct */
    bcmolt_xgpon_gem_port_key key = { };    /**< declare key */
    bcmos_bool clear_on_read;               /**< declare 'clear on read' flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_gem_port_stat stat;\n");
    bcmcli_log("bcmolt_xgpon_gem_port_key key = {  };\n");
    bcmcli_log("bcmos_bool clear_on_read;\n");
    apicli_print_start(session, "bcmolt_stat_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_GEM_PORT, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_GEM_PORT_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "gem_port_id");
    if (cli_parm != NULL)
    {
        key.gem_port_id = (bcmolt_xgpon_gem_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "gem_port_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.gem_port_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_GEM_PORT, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_GEM_PORT_KEY_ID_GEM_PORT_ID, &key.gem_port_id);
    bcmcli_log(";\n");

    /* set stat flags from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "clear");
    if (cli_parm != NULL)
    {
        clear_on_read = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "clear is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("clear_on_read = %s;\n", (clear_on_read) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* init the API struct */
    BCMOLT_STAT_INIT(&stat, xgpon_gem_port, key);
    bcmcli_log("BCMOLT_STAT_INIT(&stat, xgpon_gem_port, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "tx_bytes");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_gem_port, tx_bytes);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_gem_port, tx_bytes);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_packets");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_gem_port, tx_packets);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_gem_port, tx_packets);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_packets");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_gem_port, rx_packets);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_gem_port, rx_packets);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_bytes");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_gem_port, rx_bytes);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_gem_port, rx_bytes);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_gem_port, tx_bytes) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_gem_port, tx_packets) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_gem_port, rx_packets) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_gem_port, rx_bytes))
    {
        BCMOLT_STAT_PROP_GET(&stat, xgpon_gem_port, all_properties);
        bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_gem_port, all_properties);\n");
    }

    /* call API */
    err = bcmolt_stat_get(device_id, &stat.hdr, clear_on_read);
    bcmcli_log("bcmolt_stat_get(device_id, &stat.hdr, clear_on_read);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &stat.hdr.hdr);
    }

    apicli_print_complete(session, err, stat.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_gem_port_stat_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_gem_port_stat_cfg stat_cfg;    /**< declare main API struct */
    bcmolt_xgpon_gem_port_key key = { };        /**< declare key */
    bcmolt_xgpon_gem_port_stat_id stat_id;      /**< declare stat ID */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_gem_port_stat_cfg stat_cfg;\n");
    bcmcli_log("bcmolt_xgpon_gem_port_key key = {  };\n");
    apicli_print_start(session, "bcmolt_stat_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_GEM_PORT, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_GEM_PORT_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "gem_port_id");
    if (cli_parm != NULL)
    {
        key.gem_port_id = (bcmolt_xgpon_gem_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "gem_port_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.gem_port_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_GEM_PORT, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_GEM_PORT_KEY_ID_GEM_PORT_ID, &key.gem_port_id);
    bcmcli_log(";\n");

    /* set stat ID from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "sub");
    if (cli_parm != NULL)
    {
        stat_id = (bcmolt_xgpon_gem_port_stat_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
        return BCM_ERR_PARM;
    }

    /* init the API struct */
    switch (stat_id)
    {
        case BCMOLT_XGPON_GEM_PORT_STAT_ID_TX_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_gem_port, tx_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_gem_port, tx_bytes, key);\n");
            break;
        case BCMOLT_XGPON_GEM_PORT_STAT_ID_TX_PACKETS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_gem_port, tx_packets, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_gem_port, tx_packets, key);\n");
            break;
        case BCMOLT_XGPON_GEM_PORT_STAT_ID_RX_PACKETS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_gem_port, rx_packets, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_gem_port, rx_packets, key);\n");
            break;
        case BCMOLT_XGPON_GEM_PORT_STAT_ID_RX_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_gem_port, rx_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_gem_port, rx_bytes, key);\n");
            break;
        default:
            apicli_print_complete(session, BCM_ERR_RANGE, "\n");
            return BCM_ERR_RANGE;
    }

    /* call API */
    err = bcmolt_stat_cfg_get(device_id, &stat_cfg.hdr);
    bcmcli_log("bcmolt_stat_cfg_get(device_id, &stat_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &stat_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, stat_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_gem_port_stat_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_gem_port_stat_cfg stat_cfg;    /**< declare main API struct */
    bcmolt_xgpon_gem_port_key key = { };        /**< declare key */
    bcmolt_xgpon_gem_port_stat_id stat_id;      /**< declare stat ID */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_gem_port_stat_cfg stat_cfg;\n");
    bcmcli_log("bcmolt_xgpon_gem_port_key key = {  };\n");
    apicli_print_start(session, "bcmolt_stat_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_GEM_PORT, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_GEM_PORT_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "gem_port_id");
    if (cli_parm != NULL)
    {
        key.gem_port_id = (bcmolt_xgpon_gem_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "gem_port_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.gem_port_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_GEM_PORT, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_GEM_PORT_KEY_ID_GEM_PORT_ID, &key.gem_port_id);
    bcmcli_log(";\n");

    /* set stat ID from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "sub");
    if (cli_parm != NULL)
    {
        stat_id = (bcmolt_xgpon_gem_port_stat_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
        return BCM_ERR_PARM;
    }

    /* init the API struct */
    switch (stat_id)
    {
        case BCMOLT_XGPON_GEM_PORT_STAT_ID_TX_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_gem_port, tx_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_gem_port, tx_bytes, key);\n");
            break;
        case BCMOLT_XGPON_GEM_PORT_STAT_ID_TX_PACKETS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_gem_port, tx_packets, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_gem_port, tx_packets, key);\n");
            break;
        case BCMOLT_XGPON_GEM_PORT_STAT_ID_RX_PACKETS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_gem_port, rx_packets, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_gem_port, rx_packets, key);\n");
            break;
        case BCMOLT_XGPON_GEM_PORT_STAT_ID_RX_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_gem_port, rx_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_gem_port, rx_bytes, key);\n");
            break;
        default:
            apicli_print_complete(session, BCM_ERR_RANGE, "\n");
            return BCM_ERR_RANGE;
    }

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.");
    if (cli_parm != NULL)
    {
        bcmolt_stat_alarm_config val = { };
        cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.trigger.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.type");
            if (cli_parm != NULL)
            {
                val.trigger.type = (bcmolt_stat_condition_type) cli_parm->value.enum_val;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.type is not set\n");
                return BCM_ERR_PARM;
            }

            switch (val.trigger.type)
            {
                case BCMOLT_STAT_CONDITION_TYPE_RATE_THRESHOLD:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.rising");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_threshold.rising = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.rising is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.falling");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_threshold.falling = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.falling is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_RATE_RANGE:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.upper");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_range.upper = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.upper is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.lower");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_range.lower = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.lower is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_VALUE_THRESHOLD:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.limit");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.value_threshold.limit = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.limit is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_NONE:
                    break;
                default:
                    apicli_print_complete(session, BCM_ERR_RANGE, "\n");
                    return BCM_ERR_RANGE;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.soak.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "cfg.soak.active_soak_time");
            if (cli_parm != NULL)
            {
                val.soak.active_soak_time = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak.active_soak_time is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "cfg.soak.clear_soak_time");
            if (cli_parm != NULL)
            {
                val.soak.clear_soak_time = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak.clear_soak_time is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_STAT_CFG_PROP_SET(&stat_cfg, xgpon_gem_port, cfg, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_stat_alarm_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_GEM_PORT, BCMOLT_MGT_GROUP_STAT_CFG, 0, BCMOLT_XGPON_GEM_PORT_STAT_CFG_ID_CFG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_STAT_CFG_PROP_SET(&stat_cfg, xgpon_gem_port, cfg, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_stat_cfg_set(device_id, &stat_cfg.hdr);
    bcmcli_log("bcmolt_stat_cfg_set(device_id, &stat_cfg.hdr);\n");
    apicli_print_complete(session, err, stat_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_gem_port_auto_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_gem_port_auto_cfg auto_cfg;    /**< declare main API struct */
    bcmolt_xgpon_gem_port_key key = { };        /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_gem_port_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_xgpon_gem_port_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_get");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, xgpon_gem_port, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, xgpon_gem_port, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_cleared");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_gem_port, stat_alarm_cleared);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_gem_port, stat_alarm_cleared);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_raised");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_gem_port, stat_alarm_raised);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_gem_port, stat_alarm_raised);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_gem_port, stat_alarm_cleared) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_gem_port, stat_alarm_raised))
    {
        BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_gem_port, all_properties);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_gem_port, all_properties);\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &auto_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_gem_port_auto_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_gem_port_auto_cfg auto_cfg;    /**< declare main API struct */
    bcmolt_xgpon_gem_port_key key = { };        /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_gem_port_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_xgpon_gem_port_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_set");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, xgpon_gem_port, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, xgpon_gem_port, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_cleared");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_gem_port, stat_alarm_cleared, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_gem_port, stat_alarm_cleared, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_GEM_PORT, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_GEM_PORT_AUTO_CFG_ID_STAT_ALARM_CLEARED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_raised");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_gem_port, stat_alarm_raised, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_gem_port, stat_alarm_raised, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_GEM_PORT, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_GEM_PORT_AUTO_CFG_ID_STAT_ALARM_RAISED, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);\n");
    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_iwf_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_iwf_cfg cfg;       /**< declare main API struct */
    bcmolt_xgpon_iwf_key key = { }; /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_iwf_cfg cfg;\n");
    bcmcli_log("bcmolt_xgpon_iwf_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_IWF, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_IWF_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, xgpon_iwf, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, xgpon_iwf, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "us_otag_direct_tpid");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_iwf, us_otag_direct_tpid);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_iwf, us_otag_direct_tpid);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "ds_tpid");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_iwf, ds_tpid);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_iwf, ds_tpid);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_iwf, us_otag_direct_tpid) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_iwf, ds_tpid))
    {
        BCMOLT_CFG_PROP_GET(&cfg, xgpon_iwf, all_properties);
        bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_iwf, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_get(device_id, &cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_iwf_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_iwf_cfg cfg;       /**< declare main API struct */
    bcmolt_xgpon_iwf_key key = { }; /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_iwf_cfg cfg;\n");
    bcmcli_log("bcmolt_xgpon_iwf_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_IWF, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_IWF_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, xgpon_iwf, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, xgpon_iwf, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "us_otag_direct_tpid");
    if (cli_parm != NULL)
    {
        uint16_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_iwf, us_otag_direct_tpid, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_iwf, us_otag_direct_tpid, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_IWF, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_IWF_CFG_ID_US_OTAG_DIRECT_TPID, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "ds_tpid.");
    if (cli_parm != NULL)
    {
        bcmolt_arr_u16_5_hex val = { };
        cli_parm = bcmcli_find_named_parm(session, "ds_tpid.arr");
        if (cli_parm != NULL)
        {
            int32_t i0;
            if (cli_parm->array_size != 5)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "array ds_tpid.arr must have 5 elements\n");
                return BCM_ERR_PARM;
            }

            for (i0 = 0; i0 < 5; i0++)
            {
                val.arr[i0] = cli_parm->values[i0].unumber;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ds_tpid.arr is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_iwf, ds_tpid, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_arr_u16_5_hex val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_IWF, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_IWF_CFG_ID_DS_TPID, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_iwf, ds_tpid, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_cfg_set(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_set(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_iwf_cfg_clear(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_iwf_cfg cfg;       /**< declare main API struct */
    bcmolt_xgpon_iwf_key key = { }; /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_iwf_cfg cfg;\n");
    bcmcli_log("bcmolt_xgpon_iwf_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_clear");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_IWF, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_IWF_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, xgpon_iwf, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, xgpon_iwf, key);\n");

    /* call API */
    err = bcmolt_cfg_clear(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_clear(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_iwf_cfg_get_multi(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_iwf_cfg cfg;       /**< declare main API struct */
    bcmolt_xgpon_iwf_key key = { }; /**< declare key */
    bcmolt_msg_set *msg_set = NULL; /**< declare message set */
    uint32_t max_msgs;              /**< declare max number of msgs to get */
    bcmos_bool invert_filter;       /**< declare filter invert flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_iwf_cfg cfg;\n");
    bcmcli_log("bcmolt_xgpon_iwf_key key = {  };\n");
    bcmcli_log("bcmolt_msg_set* msg_set = NULL;\n");
    bcmcli_log("uint32_t max_msgs;\n");
    bcmcli_log("bcmos_bool invert_filter;\n");
    apicli_print_start(session, "bcmolt_cfg_get_multi");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_IWF, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_IWF_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* set max number of msgs from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "max_msgs");
    if (cli_parm != NULL)
    {
        max_msgs = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "max_msgs is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("max_msgs = %d;\n", max_msgs);

    /* set filter invert flag from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "filter_invert");
    if (cli_parm != NULL)
    {
        invert_filter = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "filter_invert is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("invert_filter = %s;\n", (invert_filter) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* allocate message set */
    err = apicli_msg_set_alloc(byte_pool, BCMOLT_OBJ_ID_XGPON_IWF, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);
    if (err != BCM_ERR_OK)
    {
        return err;
    }

    bcmcli_log("bcmolt_msg_set_alloc(BCMOLT_OBJ_ID_XGPON_IWF, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, xgpon_iwf, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, xgpon_iwf, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "filter.us_otag_direct_tpid");
    if (cli_parm != NULL)
    {
        uint16_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_iwf, us_otag_direct_tpid, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_iwf, us_otag_direct_tpid, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_IWF, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_IWF_CFG_ID_US_OTAG_DIRECT_TPID, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "us_otag_direct_tpid");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_iwf, us_otag_direct_tpid);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_iwf, us_otag_direct_tpid);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.ds_tpid.");
    if (cli_parm != NULL)
    {
        bcmolt_arr_u16_5_hex val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.ds_tpid.arr");
        if (cli_parm != NULL)
        {
            int32_t i0;
            if (cli_parm->array_size != 5)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "array filter.ds_tpid.arr must have 5 elements\n");
                return BCM_ERR_PARM;
            }

            for (i0 = 0; i0 < 5; i0++)
            {
                val.arr[i0] = cli_parm->values[i0].unumber;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ds_tpid.arr is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_iwf, ds_tpid, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_arr_u16_5_hex val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_IWF, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_IWF_CFG_ID_DS_TPID, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_iwf, ds_tpid, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "ds_tpid");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_iwf, ds_tpid);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_iwf, ds_tpid);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_iwf, us_otag_direct_tpid) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_iwf, ds_tpid))
    {
        BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_iwf, all_properties);
        bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_iwf, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);
    bcmcli_log("bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_ni_cfg_get(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_ni_cfg cfg;        /**< declare main API struct */
    bcmolt_xgpon_ni_key key = { };  /**< declare key */
    uint8_t *list_mem;              /**< declare memory buffer for variable-sized lists */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_ni_cfg cfg;\n");
    bcmcli_log("bcmolt_xgpon_ni_key key = {  };\n");
    bcmcli_log("uint8_t* list_mem;\n");
    apicli_print_start(session, "bcmolt_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_NI_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, xgpon_ni, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, xgpon_ni, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "hw_pon_id");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, hw_pon_id);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, hw_pon_id);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "available_bandwidth");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, available_bandwidth);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, available_bandwidth);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "number_of_active_onus");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, number_of_active_onus);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, number_of_active_onus);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "pon_status");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, pon_status);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, pon_status);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "pon_distance");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, pon_distance);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, pon_distance);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "ranging_window_size");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, ranging_window_size);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, ranging_window_size);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "eqd_cycles_number");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, eqd_cycles_number);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, eqd_cycles_number);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "drift_control");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, drift_control);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, drift_control);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "los_alarm_threshold");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, los_alarm_threshold);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, los_alarm_threshold);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "los_initial_value");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, los_initial_value);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, los_initial_value);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_alarms_thresholds");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, onu_alarms_thresholds);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, onu_alarms_thresholds);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "ber_monitor");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, ber_monitor);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, ber_monitor);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_activation");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, onu_activation);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, onu_activation);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "sn_acquisition");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, sn_acquisition);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, sn_acquisition);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "key_exchange");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, key_exchange);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, key_exchange);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "protection_switching");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, protection_switching);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, protection_switching);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "protection_switching_debug");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, protection_switching_debug);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, protection_switching_debug);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "cbr_rt_allocation_profile");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, cbr_rt_allocation_profile);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, cbr_rt_allocation_profile);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "cbr_nrt_allocation_profile");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, cbr_nrt_allocation_profile);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, cbr_nrt_allocation_profile);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "power_management");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, power_management);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, power_management);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rogue_onu_detection_process");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, rogue_onu_detection_process);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, rogue_onu_detection_process);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "periodic_standby_pon_monitoring");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, periodic_standby_pon_monitoring);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, periodic_standby_pon_monitoring);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "dba_mode");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, dba_mode);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, dba_mode);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "ploam_handling");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, ploam_handling);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, ploam_handling);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "min_data_alloc_id");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, min_data_alloc_id);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, min_data_alloc_id);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "min_data_gem_port_id");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, min_data_gem_port_id);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, min_data_gem_port_id);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "multicast_key");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, multicast_key);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, multicast_key);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "prbs_checker");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, prbs_checker);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, prbs_checker);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "prbs_generator");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, prbs_generator);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, prbs_generator);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "prbs_status");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, prbs_status);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, prbs_status);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "automatic_onu_deactivation");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, automatic_onu_deactivation);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, automatic_onu_deactivation);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "us_bandwidth_limit");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, us_bandwidth_limit);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, us_bandwidth_limit);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "all_onus");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, all_onus);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, all_onus);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "all_mcast_gem_ports");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, all_mcast_gem_ports);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, all_mcast_gem_ports);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "debug");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, debug);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, debug);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_upgrade_params");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, onu_upgrade_params);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, onu_upgrade_params);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "ds_fec_mode");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, ds_fec_mode);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, ds_fec_mode);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "dba_type");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, dba_type);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, dba_type);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_tuning");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, onu_tuning);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, onu_tuning);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_ni, hw_pon_id) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_ni, available_bandwidth) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_ni, number_of_active_onus) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_ni, pon_status) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_ni, pon_distance) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_ni, ranging_window_size) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_ni, eqd_cycles_number) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_ni, drift_control) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_ni, los_alarm_threshold) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_ni, los_initial_value) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_ni, onu_alarms_thresholds) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_ni, ber_monitor) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_ni, onu_activation) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_ni, sn_acquisition) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_ni, key_exchange) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_ni, protection_switching) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_ni, protection_switching_debug) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_ni, cbr_rt_allocation_profile) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_ni, cbr_nrt_allocation_profile) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_ni, power_management) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_ni, rogue_onu_detection_process) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_ni, periodic_standby_pon_monitoring) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_ni, dba_mode) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_ni, ploam_handling) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_ni, min_data_alloc_id) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_ni, min_data_gem_port_id) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_ni, multicast_key) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_ni, prbs_checker) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_ni, prbs_generator) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_ni, prbs_status) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_ni, automatic_onu_deactivation) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_ni, us_bandwidth_limit) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_ni, all_onus) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_ni, all_mcast_gem_ports) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_ni, debug) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_ni, onu_upgrade_params) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_ni, ds_fec_mode) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_ni, dba_type) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_ni, onu_tuning))
    {
        BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, all_properties);
        bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_ni, all_properties);\n");
    }

    /* set memory to use for variable-sized lists */
    list_mem = apicli_byte_pool_calloc(byte_pool, APICLI_DYNAMIC_LIST_BUFFER_SIZE);
    if (list_mem == NULL)
    {
        apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
        return BCM_ERR_NOMEM;
    }

    bcmcli_log("list_mem = bcmos_calloc(APICLI_DYNAMIC_LIST_BUFFER_SIZE);\n");
    BCMOLT_CFG_LIST_BUF_SET(&cfg, xgpon_ni, list_mem, APICLI_DYNAMIC_LIST_BUFFER_SIZE);
    bcmcli_log("BCMOLT_CFG_LIST_BUF_SET(&cfg, xgpon_ni, list_mem, APICLI_DYNAMIC_LIST_BUFFER_SIZE);\n");

    /* call API */
    err = bcmolt_cfg_get(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_get(device_id, &cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_ni_cfg_set(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_ni_cfg cfg;        /**< declare main API struct */
    bcmolt_xgpon_ni_key key = { };  /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_ni_cfg cfg;\n");
    bcmcli_log("bcmolt_xgpon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_NI_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, xgpon_ni, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, xgpon_ni, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_parm_by_prefix(session, "hw_pon_id.");
    if (cli_parm != NULL)
    {
        bcmolt_hw_pon_id val = { };
        cli_parm = bcmcli_find_named_parm(session, "hw_pon_id.pon_id_1");
        if (cli_parm != NULL)
        {
            val.pon_id_1 = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "hw_pon_id.pon_id_1 is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "hw_pon_id.pon_id_2");
        if (cli_parm != NULL)
        {
            val.pon_id_2 = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "hw_pon_id.pon_id_2 is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, hw_pon_id, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_hw_pon_id val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_HW_PON_ID, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, hw_pon_id, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "pon_distance.");
    if (cli_parm != NULL)
    {
        bcmolt_pon_distance val = { };
        cli_parm = bcmcli_find_named_parm(session, "pon_distance.max_log_distance");
        if (cli_parm != NULL)
        {
            val.max_log_distance = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "pon_distance.max_log_distance is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "pon_distance.max_diff_reach");
        if (cli_parm != NULL)
        {
            val.max_diff_reach = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "pon_distance.max_diff_reach is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, pon_distance, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_pon_distance val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_PON_DISTANCE, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, pon_distance, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "eqd_cycles_number");
    if (cli_parm != NULL)
    {
        uint32_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, eqd_cycles_number, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, eqd_cycles_number, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_EQD_CYCLES_NUMBER, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "drift_control.");
    if (cli_parm != NULL)
    {
        bcmolt_pon_drift_control val = { };
        cli_parm = bcmcli_find_named_parm(session, "drift_control.drift_interval");
        if (cli_parm != NULL)
        {
            val.drift_interval = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "drift_control.drift_interval is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "drift_control.drift_limit");
        if (cli_parm != NULL)
        {
            val.drift_limit = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "drift_control.drift_limit is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "drift_control.transmission_control_limit");
        if (cli_parm != NULL)
        {
            val.transmission_control_limit = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "drift_control.transmission_control_limit is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, drift_control, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_pon_drift_control val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_DRIFT_CONTROL, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, drift_control, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "los_alarm_threshold");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, los_alarm_threshold, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, los_alarm_threshold, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_LOS_ALARM_THRESHOLD, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "los_initial_value");
    if (cli_parm != NULL)
    {
        bcmolt_status val;
        val = (bcmolt_status) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, los_initial_value, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, los_initial_value, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_LOS_INITIAL_VALUE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "onu_alarms_thresholds.");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_onu_alarms_thresholds val = { };
        cli_parm = bcmcli_find_named_parm(session, "onu_alarms_thresholds.losi");
        if (cli_parm != NULL)
        {
            val.losi = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "onu_alarms_thresholds.losi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "onu_alarms_thresholds.lobi");
        if (cli_parm != NULL)
        {
            val.lobi = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "onu_alarms_thresholds.lobi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "onu_alarms_thresholds.looci");
        if (cli_parm != NULL)
        {
            val.looci = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "onu_alarms_thresholds.looci is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "onu_alarms_thresholds.lopci");
        if (cli_parm != NULL)
        {
            val.lopci = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "onu_alarms_thresholds.lopci is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, onu_alarms_thresholds, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_xgpon_onu_alarms_thresholds val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_ONU_ALARMS_THRESHOLDS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, onu_alarms_thresholds, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "ber_monitor.");
    if (cli_parm != NULL)
    {
        bcmolt_ber_monitor_params val = { };
        cli_parm = bcmcli_find_named_parm(session, "ber_monitor.us_ber_interval");
        if (cli_parm != NULL)
        {
            val.us_ber_interval = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ber_monitor.us_ber_interval is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "ber_monitor.sf_threshold");
        if (cli_parm != NULL)
        {
            val.sf_threshold = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ber_monitor.sf_threshold is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "ber_monitor.sd_threshold");
        if (cli_parm != NULL)
        {
            val.sd_threshold = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ber_monitor.sd_threshold is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, ber_monitor, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_ber_monitor_params val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_BER_MONITOR, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, ber_monitor, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "onu_activation.");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_onu_activation val = { };
        cli_parm = bcmcli_find_named_parm(session, "onu_activation.key_exchange");
        if (cli_parm != NULL)
        {
            val.key_exchange = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "onu_activation.key_exchange is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "onu_activation.fail_due_to_regis_auto_fail");
        if (cli_parm != NULL)
        {
            val.fail_due_to_regis_auto_fail = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "onu_activation.fail_due_to_regis_auto_fail is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, onu_activation, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_xgpon_onu_activation val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_ONU_ACTIVATION, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, onu_activation, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "sn_acquisition.");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_sn_acquisition val = { };
        cli_parm = bcmcli_find_named_parm(session, "sn_acquisition.interval");
        if (cli_parm != NULL)
        {
            val.interval = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "sn_acquisition.interval is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "sn_acquisition.control");
        if (cli_parm != NULL)
        {
            val.control = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "sn_acquisition.control is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "sn_acquisition.onu_post_discovery_mode");
        if (cli_parm != NULL)
        {
            val.onu_post_discovery_mode = (bcmolt_onu_post_discovery_mode) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "sn_acquisition.onu_post_discovery_mode is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "sn_acquisition.burst_profile");
        if (cli_parm != NULL)
        {
            val.burst_profile = (bcmolt_burst_profile_index) cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "sn_acquisition.burst_profile is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, sn_acquisition, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_xgpon_sn_acquisition val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_SN_ACQUISITION, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, sn_acquisition, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "key_exchange.");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_key_exchange val = { };
        cli_parm = bcmcli_find_named_parm(session, "key_exchange.interval");
        if (cli_parm != NULL)
        {
            val.interval = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "key_exchange.interval is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "key_exchange.control");
        if (cli_parm != NULL)
        {
            val.control = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "key_exchange.control is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "key_exchange.encrypted_ports_only");
        if (cli_parm != NULL)
        {
            val.encrypted_ports_only = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "key_exchange.encrypted_ports_only is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, key_exchange, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_xgpon_key_exchange val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_KEY_EXCHANGE, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, key_exchange, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "protection_switching.");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_protection_switching val = { };
        cli_parm = bcmcli_find_named_parm(session, "protection_switching.timeout");
        if (cli_parm != NULL)
        {
            val.timeout = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "protection_switching.timeout is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "protection_switching.gpio_pin");
        if (cli_parm != NULL)
        {
            val.gpio_pin = (bcmolt_gpio_pin) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "protection_switching.gpio_pin is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "protection_switching.fast_ranging");
        if (cli_parm != NULL)
        {
            val.fast_ranging = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "protection_switching.fast_ranging is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, protection_switching, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_xgpon_protection_switching val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_PROTECTION_SWITCHING, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, protection_switching, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "protection_switching_debug.");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_protection_switching_debug val = { };
        cli_parm = bcmcli_find_named_parm(session, "protection_switching_debug.data_map_delay_ms");
        if (cli_parm != NULL)
        {
            val.data_map_delay_ms = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "protection_switching_debug.data_map_delay_ms is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "protection_switching_debug.rerange_send_ranging_time");
        if (cli_parm != NULL)
        {
            val.rerange_send_ranging_time = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "protection_switching_debug.rerange_send_ranging_time is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "protection_switching_debug.rerange_send_ranging_time_delay");
        if (cli_parm != NULL)
        {
            val.rerange_send_ranging_time_delay = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "protection_switching_debug.rerange_send_ranging_time_delay is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, protection_switching_debug, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_xgpon_protection_switching_debug val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_PROTECTION_SWITCHING_DEBUG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, protection_switching_debug, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "cbr_rt_allocation_profile.");
    if (cli_parm != NULL)
    {
        bcmolt_cbr_rt_allocation_profile val = { };
        cli_parm = bcmcli_find_named_parm(session, "cbr_rt_allocation_profile.ma_7");
        if (cli_parm != NULL)
        {
            val.ma_7 = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cbr_rt_allocation_profile.ma_7 is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "cbr_rt_allocation_profile.ma_3");
        if (cli_parm != NULL)
        {
            val.ma_3 = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cbr_rt_allocation_profile.ma_3 is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "cbr_rt_allocation_profile.ma_1");
        if (cli_parm != NULL)
        {
            val.ma_1 = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cbr_rt_allocation_profile.ma_1 is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, cbr_rt_allocation_profile, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_cbr_rt_allocation_profile val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_CBR_RT_ALLOCATION_PROFILE, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, cbr_rt_allocation_profile, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "cbr_nrt_allocation_profile.");
    if (cli_parm != NULL)
    {
        bcmolt_arr_u16_2 val = { };
        cli_parm = bcmcli_find_named_parm(session, "cbr_nrt_allocation_profile.arr");
        if (cli_parm != NULL)
        {
            int32_t i0;
            if (cli_parm->array_size != 2)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "array cbr_nrt_allocation_profile.arr must have 2 elements\n");
                return BCM_ERR_PARM;
            }

            for (i0 = 0; i0 < 2; i0++)
            {
                val.arr[i0] = cli_parm->values[i0].unumber;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cbr_nrt_allocation_profile.arr is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, cbr_nrt_allocation_profile, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_arr_u16_2 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_CBR_NRT_ALLOCATION_PROFILE, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, cbr_nrt_allocation_profile, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "power_management.");
    if (cli_parm != NULL)
    {
        bcmolt_onu_power_management_configuration val = { };
        cli_parm = bcmcli_find_named_parm(session, "power_management.ilowpower");
        if (cli_parm != NULL)
        {
            val.ilowpower = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "power_management.ilowpower is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "power_management.iaware");
        if (cli_parm != NULL)
        {
            val.iaware = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "power_management.iaware is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "power_management.itransinit");
        if (cli_parm != NULL)
        {
            val.itransinit = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "power_management.itransinit is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "power_management.itxinit");
        if (cli_parm != NULL)
        {
            val.itxinit = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "power_management.itxinit is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "power_management.irxoff");
        if (cli_parm != NULL)
        {
            val.irxoff = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "power_management.irxoff is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "power_management.low_power_clobi");
        if (cli_parm != NULL)
        {
            val.low_power_clobi = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "power_management.low_power_clobi is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, power_management, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_onu_power_management_configuration val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_POWER_MANAGEMENT, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, power_management, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "rogue_onu_detection_process.");
    if (cli_parm != NULL)
    {
        bcmolt_rogue_onu_detection_process val = { };
        cli_parm = bcmcli_find_named_parm(session, "rogue_onu_detection_process.control");
        if (cli_parm != NULL)
        {
            val.control = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "rogue_onu_detection_process.control is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "rogue_onu_detection_process.detection_algorithm.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "rogue_onu_detection_process.detection_algorithm.algorithm_type");
            if (cli_parm != NULL)
            {
                val.detection_algorithm.algorithm_type = (bcmolt_rogue_detection_algorithm_type) cli_parm->value.enum_val;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "rogue_onu_detection_process.detection_algorithm.algorithm_type is not set\n");
                return BCM_ERR_PARM;
            }

            switch (val.detection_algorithm.algorithm_type)
            {
                case BCMOLT_ROGUE_DETECTION_ALGORITHM_TYPE_EARLY_ROGUE_DETECTION:
                    cli_parm = bcmcli_find_named_parm(session, "rogue_onu_detection_process.detection_algorithm.measurement_type");
                    if (cli_parm != NULL)
                    {
                        val.detection_algorithm.u.early_rogue_detection.measurement_type = (bcmolt_rogue_detection_window) cli_parm->value.enum_val;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "rogue_onu_detection_process.detection_algorithm.measurement_type is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "rogue_onu_detection_process.detection_algorithm.interval");
                    if (cli_parm != NULL)
                    {
                        val.detection_algorithm.u.early_rogue_detection.interval = cli_parm->value.unumber;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "rogue_onu_detection_process.detection_algorithm.interval is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "rogue_onu_detection_process.detection_algorithm.second_ranging_window");
                    if (cli_parm != NULL)
                    {
                        val.detection_algorithm.u.early_rogue_detection.second_ranging_window = cli_parm->value.number;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "rogue_onu_detection_process.detection_algorithm.second_ranging_window is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "rogue_onu_detection_process.detection_algorithm.alloc_type_to_scan");
                    if (cli_parm != NULL)
                    {
                        val.detection_algorithm.u.early_rogue_detection.alloc_type_to_scan = (bcmolt_alloc_type_to_scan) cli_parm->value.enum_val;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "rogue_onu_detection_process.detection_algorithm.alloc_type_to_scan is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_ROGUE_DETECTION_ALGORITHM_TYPE_SPECIAL_MAP:
                    cli_parm = bcmcli_find_parm_by_prefix(session, "rogue_onu_detection_process.detection_algorithm.accesses.");
                    if (cli_parm != NULL)
                    {
                        int32_t i1;
                        val.detection_algorithm.u.special_map.accesses.val = apicli_byte_pool_calloc(byte_pool, cli_parm->array_size * sizeof(*val.detection_algorithm.u.special_map.accesses.val));
                        if (val.detection_algorithm.u.special_map.accesses.val == NULL)
                        {
                            apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
                            return BCM_ERR_NOMEM;
                        }

                        val.detection_algorithm.u.special_map.accesses.len = cli_parm->array_size;
                        cli_parm = bcmcli_find_named_parm(session, "rogue_onu_detection_process.detection_algorithm.accesses.plo_size");
                        if (cli_parm != NULL)
                        {
                            if (cli_parm->array_size != val.detection_algorithm.u.special_map.accesses.len)
                            {
                                apicli_print_complete(session, BCM_ERR_PARM, "rogue_onu_detection_process.detection_algorithm.accesses.plo_size is a different size than other arrays in the struct\n");
                                return BCM_ERR_PARM;
                            }

                            for (i1 = 0; i1 < val.detection_algorithm.u.special_map.accesses.len; i1++)
                            {
                                val.detection_algorithm.u.special_map.accesses.val[i1].plo_size = cli_parm->values[i1].unumber;
                            }
                        }

                        cli_parm = bcmcli_find_named_parm(session, "rogue_onu_detection_process.detection_algorithm.accesses.alloc_id");
                        if (cli_parm != NULL)
                        {
                            if (cli_parm->array_size != val.detection_algorithm.u.special_map.accesses.len)
                            {
                                apicli_print_complete(session, BCM_ERR_PARM, "rogue_onu_detection_process.detection_algorithm.accesses.alloc_id is a different size than other arrays in the struct\n");
                                return BCM_ERR_PARM;
                            }

                            for (i1 = 0; i1 < val.detection_algorithm.u.special_map.accesses.len; i1++)
                            {
                                val.detection_algorithm.u.special_map.accesses.val[i1].alloc_id = (bcmolt_pon_alloc_id) cli_parm->values[i1].unumber;
                            }
                        }

                        cli_parm = bcmcli_find_named_parm(session, "rogue_onu_detection_process.detection_algorithm.accesses.onu_id");
                        if (cli_parm != NULL)
                        {
                            if (cli_parm->array_size != val.detection_algorithm.u.special_map.accesses.len)
                            {
                                apicli_print_complete(session, BCM_ERR_PARM, "rogue_onu_detection_process.detection_algorithm.accesses.onu_id is a different size than other arrays in the struct\n");
                                return BCM_ERR_PARM;
                            }

                            for (i1 = 0; i1 < val.detection_algorithm.u.special_map.accesses.len; i1++)
                            {
                                val.detection_algorithm.u.special_map.accesses.val[i1].onu_id = (bcmolt_pon_onu_id) cli_parm->values[i1].unumber;
                            }
                        }

                        cli_parm = bcmcli_find_named_parm(session, "rogue_onu_detection_process.detection_algorithm.accesses.access_size");
                        if (cli_parm != NULL)
                        {
                            if (cli_parm->array_size != val.detection_algorithm.u.special_map.accesses.len)
                            {
                                apicli_print_complete(session, BCM_ERR_PARM, "rogue_onu_detection_process.detection_algorithm.accesses.access_size is a different size than other arrays in the struct\n");
                                return BCM_ERR_PARM;
                            }

                            for (i1 = 0; i1 < val.detection_algorithm.u.special_map.accesses.len; i1++)
                            {
                                val.detection_algorithm.u.special_map.accesses.val[i1].access_size = cli_parm->values[i1].unumber;
                            }
                        }
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "rogue_onu_detection_process.detection_algorithm.accesses is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_ROGUE_DETECTION_ALGORITHM_TYPE_EXTENDED_GUARD_TIME:
                    cli_parm = bcmcli_find_named_parm(session, "rogue_onu_detection_process.detection_algorithm.additional_guard_time");
                    if (cli_parm != NULL)
                    {
                        val.detection_algorithm.u.extended_guard_time.additional_guard_time = cli_parm->value.unumber;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "rogue_onu_detection_process.detection_algorithm.additional_guard_time is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                default:
                    apicli_print_complete(session, BCM_ERR_RANGE, "\n");
                    return BCM_ERR_RANGE;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "rogue_onu_detection_process.detection_algorithm is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, rogue_onu_detection_process, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_rogue_onu_detection_process val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_ROGUE_ONU_DETECTION_PROCESS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, rogue_onu_detection_process, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "periodic_standby_pon_monitoring.");
    if (cli_parm != NULL)
    {
        bcmolt_periodic_standby_pon_monitoring val = { };
        cli_parm = bcmcli_find_named_parm(session, "periodic_standby_pon_monitoring.interval");
        if (cli_parm != NULL)
        {
            val.interval = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "periodic_standby_pon_monitoring.interval is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "periodic_standby_pon_monitoring.control");
        if (cli_parm != NULL)
        {
            val.control = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "periodic_standby_pon_monitoring.control is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, periodic_standby_pon_monitoring, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_periodic_standby_pon_monitoring val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_PERIODIC_STANDBY_PON_MONITORING, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, periodic_standby_pon_monitoring, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "dba_mode");
    if (cli_parm != NULL)
    {
        bcmolt_dba_mode val;
        val = (bcmolt_dba_mode) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, dba_mode, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, dba_mode, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_DBA_MODE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "ploam_handling.");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_ploam_handling val = { };
        cli_parm = bcmcli_find_named_parm(session, "ploam_handling.ack_timeout");
        if (cli_parm != NULL)
        {
            val.ack_timeout = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ploam_handling.ack_timeout is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "ploam_handling.retrans_ranging_time");
        if (cli_parm != NULL)
        {
            val.retrans_ranging_time = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ploam_handling.retrans_ranging_time is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "ploam_handling.retrans_assign_alloc_id");
        if (cli_parm != NULL)
        {
            val.retrans_assign_alloc_id = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ploam_handling.retrans_assign_alloc_id is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "ploam_handling.retrans_key_control");
        if (cli_parm != NULL)
        {
            val.retrans_key_control = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ploam_handling.retrans_key_control is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "ploam_handling.retrans_request_registration");
        if (cli_parm != NULL)
        {
            val.retrans_request_registration = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ploam_handling.retrans_request_registration is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, ploam_handling, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_xgpon_ploam_handling val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_PLOAM_HANDLING, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, ploam_handling, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "min_data_alloc_id");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_alloc_id val;
        val = (bcmolt_xgpon_alloc_id) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, min_data_alloc_id, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, min_data_alloc_id, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_MIN_DATA_ALLOC_ID, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "min_data_gem_port_id");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_gem_id val;
        val = (bcmolt_xgpon_gem_id) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, min_data_gem_port_id, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, min_data_gem_port_id, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_MIN_DATA_GEM_PORT_ID, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "multicast_key.");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_multicast_key val = { };
        cli_parm = bcmcli_find_parm_by_prefix(session, "multicast_key.key.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "multicast_key.key.bytes");
            if (cli_parm != NULL)
            {
                if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 16)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "buffer multicast_key.key.bytes must have 16 bytes\n");
                    return BCM_ERR_PARM;
                }

                bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
                bcmolt_buf_read(&cli_parm->value.buffer, val.key.bytes, 16);
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "multicast_key.key.bytes is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "multicast_key.key is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "multicast_key.key_control");
        if (cli_parm != NULL)
        {
            val.key_control = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "multicast_key.key_control is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, multicast_key, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_xgpon_multicast_key val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_MULTICAST_KEY, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, multicast_key, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "prbs_checker.");
    if (cli_parm != NULL)
    {
        bcmolt_prbs_checker_config val = { };
        cli_parm = bcmcli_find_named_parm(session, "prbs_checker.polynom");
        if (cli_parm != NULL)
        {
            val.polynom = (bcmolt_prbs_polynomial) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "prbs_checker.polynom is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "prbs_checker.mode");
        if (cli_parm != NULL)
        {
            val.mode = (bcmolt_prbs_checker_mode) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "prbs_checker.mode is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "prbs_checker.data_invert");
        if (cli_parm != NULL)
        {
            val.data_invert = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "prbs_checker.data_invert is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "prbs_checker.control");
        if (cli_parm != NULL)
        {
            val.control = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "prbs_checker.control is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, prbs_checker, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_prbs_checker_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_PRBS_CHECKER, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, prbs_checker, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "prbs_generator.");
    if (cli_parm != NULL)
    {
        bcmolt_prbs_generator_config val = { };
        cli_parm = bcmcli_find_named_parm(session, "prbs_generator.polynom");
        if (cli_parm != NULL)
        {
            val.polynom = (bcmolt_prbs_polynomial) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "prbs_generator.polynom is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "prbs_generator.error_insert");
        if (cli_parm != NULL)
        {
            val.error_insert = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "prbs_generator.error_insert is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "prbs_generator.invert");
        if (cli_parm != NULL)
        {
            val.invert = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "prbs_generator.invert is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "prbs_generator.control");
        if (cli_parm != NULL)
        {
            val.control = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "prbs_generator.control is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, prbs_generator, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_prbs_generator_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_PRBS_GENERATOR, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, prbs_generator, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "automatic_onu_deactivation.");
    if (cli_parm != NULL)
    {
        bcmolt_automatic_onu_deactivation val = { };
        cli_parm = bcmcli_find_named_parm(session, "automatic_onu_deactivation.los");
        if (cli_parm != NULL)
        {
            val.los = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "automatic_onu_deactivation.los is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "automatic_onu_deactivation.onu_alarms");
        if (cli_parm != NULL)
        {
            val.onu_alarms = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "automatic_onu_deactivation.onu_alarms is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "automatic_onu_deactivation.tiwi");
        if (cli_parm != NULL)
        {
            val.tiwi = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "automatic_onu_deactivation.tiwi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "automatic_onu_deactivation.ack_timeout");
        if (cli_parm != NULL)
        {
            val.ack_timeout = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "automatic_onu_deactivation.ack_timeout is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "automatic_onu_deactivation.sfi");
        if (cli_parm != NULL)
        {
            val.sfi = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "automatic_onu_deactivation.sfi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "automatic_onu_deactivation.loki");
        if (cli_parm != NULL)
        {
            val.loki = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "automatic_onu_deactivation.loki is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, automatic_onu_deactivation, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_automatic_onu_deactivation val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_AUTOMATIC_ONU_DEACTIVATION, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, automatic_onu_deactivation, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "us_bandwidth_limit");
    if (cli_parm != NULL)
    {
        uint32_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, us_bandwidth_limit, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, us_bandwidth_limit, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_US_BANDWIDTH_LIMIT, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "debug.");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_ni_debug val = { };
        cli_parm = bcmcli_find_named_parm(session, "debug.increase_available_cbr_bw");
        if (cli_parm != NULL)
        {
            val.increase_available_cbr_bw = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "debug.increase_available_cbr_bw is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "debug.inter_burst_gap_in_bytes");
        if (cli_parm != NULL)
        {
            val.inter_burst_gap_in_bytes = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "debug.inter_burst_gap_in_bytes is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "debug.number_of_gem_ports_per_onu");
        if (cli_parm != NULL)
        {
            val.number_of_gem_ports_per_onu = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "debug.number_of_gem_ports_per_onu is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, debug, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_xgpon_ni_debug val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_DEBUG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, debug, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "onu_upgrade_params.");
    if (cli_parm != NULL)
    {
        bcmolt_gpon_onu_upgrade_params val = { };
        cli_parm = bcmcli_find_named_parm(session, "onu_upgrade_params.response_timeout_ms");
        if (cli_parm != NULL)
        {
            val.response_timeout_ms = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "onu_upgrade_params.response_timeout_ms is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "onu_upgrade_params.max_retry_count");
        if (cli_parm != NULL)
        {
            val.max_retry_count = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "onu_upgrade_params.max_retry_count is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "onu_upgrade_params.omci_format");
        if (cli_parm != NULL)
        {
            val.omci_format = (bcmolt_omci_device_id) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "onu_upgrade_params.omci_format is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "onu_upgrade_params.window_size");
        if (cli_parm != NULL)
        {
            val.window_size = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "onu_upgrade_params.window_size is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "onu_upgrade_params.activate_commit");
        if (cli_parm != NULL)
        {
            val.activate_commit = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "onu_upgrade_params.activate_commit is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "onu_upgrade_params.delay_for_commit_ms");
        if (cli_parm != NULL)
        {
            val.delay_for_commit_ms = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "onu_upgrade_params.delay_for_commit_ms is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "onu_upgrade_params.max_activation_attempts");
        if (cli_parm != NULL)
        {
            val.max_activation_attempts = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "onu_upgrade_params.max_activation_attempts is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, onu_upgrade_params, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_gpon_onu_upgrade_params val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_ONU_UPGRADE_PARAMS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, onu_upgrade_params, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "ds_fec_mode");
    if (cli_parm != NULL)
    {
        bcmolt_control_state val;
        val = (bcmolt_control_state) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, ds_fec_mode, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, ds_fec_mode, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_DS_FEC_MODE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "dba_type");
    if (cli_parm != NULL)
    {
        bcmolt_dba_type val;
        val = (bcmolt_dba_type) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, dba_type, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, dba_type, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_DBA_TYPE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "onu_tuning.");
    if (cli_parm != NULL)
    {
        bcmolt_onu_tuning_configuration val = { };
        cli_parm = bcmcli_find_named_parm(session, "onu_tuning.tsource");
        if (cli_parm != NULL)
        {
            val.tsource = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "onu_tuning.tsource is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "onu_tuning.ttarget");
        if (cli_parm != NULL)
        {
            val.ttarget = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "onu_tuning.ttarget is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "onu_tuning.request_registration_required");
        if (cli_parm != NULL)
        {
            val.request_registration_required = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "onu_tuning.request_registration_required is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, onu_tuning, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_onu_tuning_configuration val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_ONU_TUNING, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, onu_tuning, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_cfg_set(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_set(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_ni_cfg_clear(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_ni_cfg cfg;        /**< declare main API struct */
    bcmolt_xgpon_ni_key key = { };  /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_ni_cfg cfg;\n");
    bcmcli_log("bcmolt_xgpon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_clear");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_NI_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, xgpon_ni, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, xgpon_ni, key);\n");

    /* call API */
    err = bcmolt_cfg_clear(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_clear(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_ni_cfg_get_multi(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_ni_cfg cfg;        /**< declare main API struct */
    bcmolt_xgpon_ni_key key = { };  /**< declare key */
    bcmolt_msg_set *msg_set = NULL; /**< declare message set */
    uint32_t max_msgs;              /**< declare max number of msgs to get */
    bcmos_bool invert_filter;       /**< declare filter invert flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_ni_cfg cfg;\n");
    bcmcli_log("bcmolt_xgpon_ni_key key = {  };\n");
    bcmcli_log("bcmolt_msg_set* msg_set = NULL;\n");
    bcmcli_log("uint32_t max_msgs;\n");
    bcmcli_log("bcmos_bool invert_filter;\n");
    apicli_print_start(session, "bcmolt_cfg_get_multi");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_NI_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* set max number of msgs from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "max_msgs");
    if (cli_parm != NULL)
    {
        max_msgs = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "max_msgs is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("max_msgs = %d;\n", max_msgs);

    /* set filter invert flag from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "filter_invert");
    if (cli_parm != NULL)
    {
        invert_filter = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "filter_invert is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("invert_filter = %s;\n", (invert_filter) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* allocate message set */
    err = apicli_msg_set_alloc(byte_pool, BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);
    if (err != BCM_ERR_OK)
    {
        return err;
    }

    bcmcli_log("bcmolt_msg_set_alloc(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, xgpon_ni, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, xgpon_ni, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.hw_pon_id.");
    if (cli_parm != NULL)
    {
        bcmolt_hw_pon_id val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.hw_pon_id.pon_id_1");
        if (cli_parm != NULL)
        {
            val.pon_id_1 = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.hw_pon_id.pon_id_1 is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.hw_pon_id.pon_id_2");
        if (cli_parm != NULL)
        {
            val.pon_id_2 = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.hw_pon_id.pon_id_2 is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, hw_pon_id, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_hw_pon_id val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_HW_PON_ID, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, hw_pon_id, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "hw_pon_id");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, hw_pon_id);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, hw_pon_id);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.available_bandwidth.");
    if (cli_parm != NULL)
    {
        bcmolt_pon_available_bandwidth val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.available_bandwidth.cbr_bw");
        if (cli_parm != NULL)
        {
            val.cbr_bw = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.available_bandwidth.cbr_bw is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.available_bandwidth.total_bw");
        if (cli_parm != NULL)
        {
            val.total_bw = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.available_bandwidth.total_bw is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.available_bandwidth.next_onu_total_bw");
        if (cli_parm != NULL)
        {
            val.next_onu_total_bw = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.available_bandwidth.next_onu_total_bw is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, available_bandwidth, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_pon_available_bandwidth val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_AVAILABLE_BANDWIDTH, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, available_bandwidth, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "available_bandwidth");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, available_bandwidth);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, available_bandwidth);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.number_of_active_onus");
    if (cli_parm != NULL)
    {
        uint16_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, number_of_active_onus, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, number_of_active_onus, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_NUMBER_OF_ACTIVE_ONUS, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "number_of_active_onus");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, number_of_active_onus);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, number_of_active_onus);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.pon_status.");
    if (cli_parm != NULL)
    {
        bcmolt_pon_status val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.pon_status.state");
        if (cli_parm != NULL)
        {
            val.state = (bcmolt_pon_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.pon_status.state is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.pon_status.los_status");
        if (cli_parm != NULL)
        {
            val.los_status = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.pon_status.los_status is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, pon_status, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_pon_status val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_PON_STATUS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, pon_status, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "pon_status");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, pon_status);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, pon_status);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.pon_distance.");
    if (cli_parm != NULL)
    {
        bcmolt_pon_distance val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.pon_distance.max_log_distance");
        if (cli_parm != NULL)
        {
            val.max_log_distance = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.pon_distance.max_log_distance is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.pon_distance.max_diff_reach");
        if (cli_parm != NULL)
        {
            val.max_diff_reach = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.pon_distance.max_diff_reach is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, pon_distance, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_pon_distance val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_PON_DISTANCE, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, pon_distance, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "pon_distance");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, pon_distance);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, pon_distance);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.ranging_window_size");
    if (cli_parm != NULL)
    {
        uint32_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, ranging_window_size, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, ranging_window_size, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_RANGING_WINDOW_SIZE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "ranging_window_size");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, ranging_window_size);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, ranging_window_size);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.eqd_cycles_number");
    if (cli_parm != NULL)
    {
        uint32_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, eqd_cycles_number, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, eqd_cycles_number, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_EQD_CYCLES_NUMBER, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "eqd_cycles_number");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, eqd_cycles_number);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, eqd_cycles_number);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.drift_control.");
    if (cli_parm != NULL)
    {
        bcmolt_pon_drift_control val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.drift_control.drift_interval");
        if (cli_parm != NULL)
        {
            val.drift_interval = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.drift_control.drift_interval is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.drift_control.drift_limit");
        if (cli_parm != NULL)
        {
            val.drift_limit = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.drift_control.drift_limit is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.drift_control.transmission_control_limit");
        if (cli_parm != NULL)
        {
            val.transmission_control_limit = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.drift_control.transmission_control_limit is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, drift_control, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_pon_drift_control val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_DRIFT_CONTROL, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, drift_control, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "drift_control");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, drift_control);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, drift_control);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.los_alarm_threshold");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, los_alarm_threshold, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, los_alarm_threshold, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_LOS_ALARM_THRESHOLD, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "los_alarm_threshold");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, los_alarm_threshold);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, los_alarm_threshold);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.los_initial_value");
    if (cli_parm != NULL)
    {
        bcmolt_status val;
        val = (bcmolt_status) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, los_initial_value, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, los_initial_value, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_LOS_INITIAL_VALUE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "los_initial_value");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, los_initial_value);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, los_initial_value);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.onu_alarms_thresholds.");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_onu_alarms_thresholds val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.onu_alarms_thresholds.losi");
        if (cli_parm != NULL)
        {
            val.losi = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.onu_alarms_thresholds.losi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.onu_alarms_thresholds.lobi");
        if (cli_parm != NULL)
        {
            val.lobi = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.onu_alarms_thresholds.lobi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.onu_alarms_thresholds.looci");
        if (cli_parm != NULL)
        {
            val.looci = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.onu_alarms_thresholds.looci is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.onu_alarms_thresholds.lopci");
        if (cli_parm != NULL)
        {
            val.lopci = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.onu_alarms_thresholds.lopci is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, onu_alarms_thresholds, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_xgpon_onu_alarms_thresholds val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_ONU_ALARMS_THRESHOLDS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, onu_alarms_thresholds, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_alarms_thresholds");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, onu_alarms_thresholds);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, onu_alarms_thresholds);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.ber_monitor.");
    if (cli_parm != NULL)
    {
        bcmolt_ber_monitor_params val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.ber_monitor.us_ber_interval");
        if (cli_parm != NULL)
        {
            val.us_ber_interval = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ber_monitor.us_ber_interval is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.ber_monitor.sf_threshold");
        if (cli_parm != NULL)
        {
            val.sf_threshold = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ber_monitor.sf_threshold is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.ber_monitor.sd_threshold");
        if (cli_parm != NULL)
        {
            val.sd_threshold = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ber_monitor.sd_threshold is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, ber_monitor, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_ber_monitor_params val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_BER_MONITOR, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, ber_monitor, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "ber_monitor");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, ber_monitor);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, ber_monitor);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.onu_activation.");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_onu_activation val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.onu_activation.key_exchange");
        if (cli_parm != NULL)
        {
            val.key_exchange = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.onu_activation.key_exchange is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.onu_activation.fail_due_to_regis_auto_fail");
        if (cli_parm != NULL)
        {
            val.fail_due_to_regis_auto_fail = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.onu_activation.fail_due_to_regis_auto_fail is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, onu_activation, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_xgpon_onu_activation val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_ONU_ACTIVATION, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, onu_activation, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_activation");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, onu_activation);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, onu_activation);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.sn_acquisition.");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_sn_acquisition val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.sn_acquisition.interval");
        if (cli_parm != NULL)
        {
            val.interval = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.sn_acquisition.interval is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.sn_acquisition.control");
        if (cli_parm != NULL)
        {
            val.control = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.sn_acquisition.control is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.sn_acquisition.onu_post_discovery_mode");
        if (cli_parm != NULL)
        {
            val.onu_post_discovery_mode = (bcmolt_onu_post_discovery_mode) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.sn_acquisition.onu_post_discovery_mode is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.sn_acquisition.burst_profile");
        if (cli_parm != NULL)
        {
            val.burst_profile = (bcmolt_burst_profile_index) cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.sn_acquisition.burst_profile is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, sn_acquisition, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_xgpon_sn_acquisition val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_SN_ACQUISITION, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, sn_acquisition, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "sn_acquisition");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, sn_acquisition);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, sn_acquisition);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.key_exchange.");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_key_exchange val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.key_exchange.interval");
        if (cli_parm != NULL)
        {
            val.interval = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.key_exchange.interval is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.key_exchange.control");
        if (cli_parm != NULL)
        {
            val.control = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.key_exchange.control is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.key_exchange.encrypted_ports_only");
        if (cli_parm != NULL)
        {
            val.encrypted_ports_only = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.key_exchange.encrypted_ports_only is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, key_exchange, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_xgpon_key_exchange val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_KEY_EXCHANGE, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, key_exchange, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "key_exchange");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, key_exchange);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, key_exchange);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.protection_switching.");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_protection_switching val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.protection_switching.timeout");
        if (cli_parm != NULL)
        {
            val.timeout = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.protection_switching.timeout is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.protection_switching.gpio_pin");
        if (cli_parm != NULL)
        {
            val.gpio_pin = (bcmolt_gpio_pin) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.protection_switching.gpio_pin is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.protection_switching.fast_ranging");
        if (cli_parm != NULL)
        {
            val.fast_ranging = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.protection_switching.fast_ranging is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, protection_switching, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_xgpon_protection_switching val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_PROTECTION_SWITCHING, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, protection_switching, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "protection_switching");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, protection_switching);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, protection_switching);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.protection_switching_debug.");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_protection_switching_debug val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.protection_switching_debug.data_map_delay_ms");
        if (cli_parm != NULL)
        {
            val.data_map_delay_ms = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.protection_switching_debug.data_map_delay_ms is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.protection_switching_debug.rerange_send_ranging_time");
        if (cli_parm != NULL)
        {
            val.rerange_send_ranging_time = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.protection_switching_debug.rerange_send_ranging_time is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.protection_switching_debug.rerange_send_ranging_time_delay");
        if (cli_parm != NULL)
        {
            val.rerange_send_ranging_time_delay = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.protection_switching_debug.rerange_send_ranging_time_delay is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, protection_switching_debug, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_xgpon_protection_switching_debug val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_PROTECTION_SWITCHING_DEBUG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, protection_switching_debug, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "protection_switching_debug");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, protection_switching_debug);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, protection_switching_debug);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.cbr_rt_allocation_profile.");
    if (cli_parm != NULL)
    {
        bcmolt_cbr_rt_allocation_profile val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.cbr_rt_allocation_profile.ma_7");
        if (cli_parm != NULL)
        {
            val.ma_7 = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.cbr_rt_allocation_profile.ma_7 is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.cbr_rt_allocation_profile.ma_3");
        if (cli_parm != NULL)
        {
            val.ma_3 = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.cbr_rt_allocation_profile.ma_3 is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.cbr_rt_allocation_profile.ma_1");
        if (cli_parm != NULL)
        {
            val.ma_1 = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.cbr_rt_allocation_profile.ma_1 is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, cbr_rt_allocation_profile, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_cbr_rt_allocation_profile val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_CBR_RT_ALLOCATION_PROFILE, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, cbr_rt_allocation_profile, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "cbr_rt_allocation_profile");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, cbr_rt_allocation_profile);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, cbr_rt_allocation_profile);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.cbr_nrt_allocation_profile.");
    if (cli_parm != NULL)
    {
        bcmolt_arr_u16_2 val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.cbr_nrt_allocation_profile.arr");
        if (cli_parm != NULL)
        {
            int32_t i0;
            if (cli_parm->array_size != 2)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "array filter.cbr_nrt_allocation_profile.arr must have 2 elements\n");
                return BCM_ERR_PARM;
            }

            for (i0 = 0; i0 < 2; i0++)
            {
                val.arr[i0] = cli_parm->values[i0].unumber;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.cbr_nrt_allocation_profile.arr is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, cbr_nrt_allocation_profile, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_arr_u16_2 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_CBR_NRT_ALLOCATION_PROFILE, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, cbr_nrt_allocation_profile, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "cbr_nrt_allocation_profile");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, cbr_nrt_allocation_profile);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, cbr_nrt_allocation_profile);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.power_management.");
    if (cli_parm != NULL)
    {
        bcmolt_onu_power_management_configuration val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.power_management.ilowpower");
        if (cli_parm != NULL)
        {
            val.ilowpower = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.power_management.ilowpower is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.power_management.iaware");
        if (cli_parm != NULL)
        {
            val.iaware = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.power_management.iaware is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.power_management.itransinit");
        if (cli_parm != NULL)
        {
            val.itransinit = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.power_management.itransinit is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.power_management.itxinit");
        if (cli_parm != NULL)
        {
            val.itxinit = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.power_management.itxinit is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.power_management.irxoff");
        if (cli_parm != NULL)
        {
            val.irxoff = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.power_management.irxoff is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.power_management.low_power_clobi");
        if (cli_parm != NULL)
        {
            val.low_power_clobi = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.power_management.low_power_clobi is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, power_management, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_onu_power_management_configuration val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_POWER_MANAGEMENT, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, power_management, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "power_management");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, power_management);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, power_management);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.rogue_onu_detection_process.");
    if (cli_parm != NULL)
    {
        bcmolt_rogue_onu_detection_process val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.rogue_onu_detection_process.control");
        if (cli_parm != NULL)
        {
            val.control = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.rogue_onu_detection_process.control is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "filter.rogue_onu_detection_process.detection_algorithm.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "filter.rogue_onu_detection_process.detection_algorithm.algorithm_type");
            if (cli_parm != NULL)
            {
                val.detection_algorithm.algorithm_type = (bcmolt_rogue_detection_algorithm_type) cli_parm->value.enum_val;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.rogue_onu_detection_process.detection_algorithm.algorithm_type is not set\n");
                return BCM_ERR_PARM;
            }

            switch (val.detection_algorithm.algorithm_type)
            {
                case BCMOLT_ROGUE_DETECTION_ALGORITHM_TYPE_EARLY_ROGUE_DETECTION:
                    cli_parm = bcmcli_find_named_parm(session, "filter.rogue_onu_detection_process.detection_algorithm.measurement_type");
                    if (cli_parm != NULL)
                    {
                        val.detection_algorithm.u.early_rogue_detection.measurement_type = (bcmolt_rogue_detection_window) cli_parm->value.enum_val;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "filter.rogue_onu_detection_process.detection_algorithm.measurement_type is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "filter.rogue_onu_detection_process.detection_algorithm.interval");
                    if (cli_parm != NULL)
                    {
                        val.detection_algorithm.u.early_rogue_detection.interval = cli_parm->value.unumber;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "filter.rogue_onu_detection_process.detection_algorithm.interval is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "filter.rogue_onu_detection_process.detection_algorithm.second_ranging_window");
                    if (cli_parm != NULL)
                    {
                        val.detection_algorithm.u.early_rogue_detection.second_ranging_window = cli_parm->value.number;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "filter.rogue_onu_detection_process.detection_algorithm.second_ranging_window is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "filter.rogue_onu_detection_process.detection_algorithm.alloc_type_to_scan");
                    if (cli_parm != NULL)
                    {
                        val.detection_algorithm.u.early_rogue_detection.alloc_type_to_scan = (bcmolt_alloc_type_to_scan) cli_parm->value.enum_val;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "filter.rogue_onu_detection_process.detection_algorithm.alloc_type_to_scan is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_ROGUE_DETECTION_ALGORITHM_TYPE_SPECIAL_MAP:
                    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.rogue_onu_detection_process.detection_algorithm.accesses.");
                    if (cli_parm != NULL)
                    {
                        int32_t i1;
                        val.detection_algorithm.u.special_map.accesses.val = apicli_byte_pool_calloc(byte_pool, cli_parm->array_size * sizeof(*val.detection_algorithm.u.special_map.accesses.val));
                        if (val.detection_algorithm.u.special_map.accesses.val == NULL)
                        {
                            apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
                            return BCM_ERR_NOMEM;
                        }

                        val.detection_algorithm.u.special_map.accesses.len = cli_parm->array_size;
                        cli_parm = bcmcli_find_named_parm(session, "filter.rogue_onu_detection_process.detection_algorithm.accesses.plo_size");
                        if (cli_parm != NULL)
                        {
                            if (cli_parm->array_size != val.detection_algorithm.u.special_map.accesses.len)
                            {
                                apicli_print_complete(session, BCM_ERR_PARM, "filter.rogue_onu_detection_process.detection_algorithm.accesses.plo_size is a different size than other arrays in the struct\n");
                                return BCM_ERR_PARM;
                            }

                            for (i1 = 0; i1 < val.detection_algorithm.u.special_map.accesses.len; i1++)
                            {
                                val.detection_algorithm.u.special_map.accesses.val[i1].plo_size = cli_parm->values[i1].unumber;
                            }
                        }

                        cli_parm = bcmcli_find_named_parm(session, "filter.rogue_onu_detection_process.detection_algorithm.accesses.alloc_id");
                        if (cli_parm != NULL)
                        {
                            if (cli_parm->array_size != val.detection_algorithm.u.special_map.accesses.len)
                            {
                                apicli_print_complete(session, BCM_ERR_PARM, "filter.rogue_onu_detection_process.detection_algorithm.accesses.alloc_id is a different size than other arrays in the struct\n");
                                return BCM_ERR_PARM;
                            }

                            for (i1 = 0; i1 < val.detection_algorithm.u.special_map.accesses.len; i1++)
                            {
                                val.detection_algorithm.u.special_map.accesses.val[i1].alloc_id = (bcmolt_pon_alloc_id) cli_parm->values[i1].unumber;
                            }
                        }

                        cli_parm = bcmcli_find_named_parm(session, "filter.rogue_onu_detection_process.detection_algorithm.accesses.onu_id");
                        if (cli_parm != NULL)
                        {
                            if (cli_parm->array_size != val.detection_algorithm.u.special_map.accesses.len)
                            {
                                apicli_print_complete(session, BCM_ERR_PARM, "filter.rogue_onu_detection_process.detection_algorithm.accesses.onu_id is a different size than other arrays in the struct\n");
                                return BCM_ERR_PARM;
                            }

                            for (i1 = 0; i1 < val.detection_algorithm.u.special_map.accesses.len; i1++)
                            {
                                val.detection_algorithm.u.special_map.accesses.val[i1].onu_id = (bcmolt_pon_onu_id) cli_parm->values[i1].unumber;
                            }
                        }

                        cli_parm = bcmcli_find_named_parm(session, "filter.rogue_onu_detection_process.detection_algorithm.accesses.access_size");
                        if (cli_parm != NULL)
                        {
                            if (cli_parm->array_size != val.detection_algorithm.u.special_map.accesses.len)
                            {
                                apicli_print_complete(session, BCM_ERR_PARM, "filter.rogue_onu_detection_process.detection_algorithm.accesses.access_size is a different size than other arrays in the struct\n");
                                return BCM_ERR_PARM;
                            }

                            for (i1 = 0; i1 < val.detection_algorithm.u.special_map.accesses.len; i1++)
                            {
                                val.detection_algorithm.u.special_map.accesses.val[i1].access_size = cli_parm->values[i1].unumber;
                            }
                        }
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "filter.rogue_onu_detection_process.detection_algorithm.accesses is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_ROGUE_DETECTION_ALGORITHM_TYPE_EXTENDED_GUARD_TIME:
                    cli_parm = bcmcli_find_named_parm(session, "filter.rogue_onu_detection_process.detection_algorithm.additional_guard_time");
                    if (cli_parm != NULL)
                    {
                        val.detection_algorithm.u.extended_guard_time.additional_guard_time = cli_parm->value.unumber;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "filter.rogue_onu_detection_process.detection_algorithm.additional_guard_time is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                default:
                    apicli_print_complete(session, BCM_ERR_RANGE, "\n");
                    return BCM_ERR_RANGE;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.rogue_onu_detection_process.detection_algorithm is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, rogue_onu_detection_process, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_rogue_onu_detection_process val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_ROGUE_ONU_DETECTION_PROCESS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, rogue_onu_detection_process, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rogue_onu_detection_process");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, rogue_onu_detection_process);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, rogue_onu_detection_process);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.periodic_standby_pon_monitoring.");
    if (cli_parm != NULL)
    {
        bcmolt_periodic_standby_pon_monitoring val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.periodic_standby_pon_monitoring.interval");
        if (cli_parm != NULL)
        {
            val.interval = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.periodic_standby_pon_monitoring.interval is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.periodic_standby_pon_monitoring.control");
        if (cli_parm != NULL)
        {
            val.control = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.periodic_standby_pon_monitoring.control is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, periodic_standby_pon_monitoring, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_periodic_standby_pon_monitoring val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_PERIODIC_STANDBY_PON_MONITORING, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, periodic_standby_pon_monitoring, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "periodic_standby_pon_monitoring");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, periodic_standby_pon_monitoring);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, periodic_standby_pon_monitoring);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.dba_mode");
    if (cli_parm != NULL)
    {
        bcmolt_dba_mode val;
        val = (bcmolt_dba_mode) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, dba_mode, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, dba_mode, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_DBA_MODE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "dba_mode");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, dba_mode);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, dba_mode);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.ploam_handling.");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_ploam_handling val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.ploam_handling.ack_timeout");
        if (cli_parm != NULL)
        {
            val.ack_timeout = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ploam_handling.ack_timeout is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.ploam_handling.retrans_ranging_time");
        if (cli_parm != NULL)
        {
            val.retrans_ranging_time = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ploam_handling.retrans_ranging_time is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.ploam_handling.retrans_assign_alloc_id");
        if (cli_parm != NULL)
        {
            val.retrans_assign_alloc_id = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ploam_handling.retrans_assign_alloc_id is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.ploam_handling.retrans_key_control");
        if (cli_parm != NULL)
        {
            val.retrans_key_control = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ploam_handling.retrans_key_control is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.ploam_handling.retrans_request_registration");
        if (cli_parm != NULL)
        {
            val.retrans_request_registration = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ploam_handling.retrans_request_registration is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, ploam_handling, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_xgpon_ploam_handling val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_PLOAM_HANDLING, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, ploam_handling, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "ploam_handling");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, ploam_handling);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, ploam_handling);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.min_data_alloc_id");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_alloc_id val;
        val = (bcmolt_xgpon_alloc_id) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, min_data_alloc_id, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, min_data_alloc_id, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_MIN_DATA_ALLOC_ID, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "min_data_alloc_id");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, min_data_alloc_id);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, min_data_alloc_id);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.min_data_gem_port_id");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_gem_id val;
        val = (bcmolt_xgpon_gem_id) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, min_data_gem_port_id, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, min_data_gem_port_id, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_MIN_DATA_GEM_PORT_ID, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "min_data_gem_port_id");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, min_data_gem_port_id);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, min_data_gem_port_id);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.multicast_key.");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_multicast_key val = { };
        cli_parm = bcmcli_find_parm_by_prefix(session, "filter.multicast_key.key.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "filter.multicast_key.key.bytes");
            if (cli_parm != NULL)
            {
                if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 16)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "buffer filter.multicast_key.key.bytes must have 16 bytes\n");
                    return BCM_ERR_PARM;
                }

                bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
                bcmolt_buf_read(&cli_parm->value.buffer, val.key.bytes, 16);
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.multicast_key.key.bytes is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.multicast_key.key is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.multicast_key.key_control");
        if (cli_parm != NULL)
        {
            val.key_control = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.multicast_key.key_control is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, multicast_key, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_xgpon_multicast_key val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_MULTICAST_KEY, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, multicast_key, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "multicast_key");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, multicast_key);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, multicast_key);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.prbs_checker.");
    if (cli_parm != NULL)
    {
        bcmolt_prbs_checker_config val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_checker.polynom");
        if (cli_parm != NULL)
        {
            val.polynom = (bcmolt_prbs_polynomial) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_checker.polynom is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_checker.mode");
        if (cli_parm != NULL)
        {
            val.mode = (bcmolt_prbs_checker_mode) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_checker.mode is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_checker.data_invert");
        if (cli_parm != NULL)
        {
            val.data_invert = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_checker.data_invert is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_checker.control");
        if (cli_parm != NULL)
        {
            val.control = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_checker.control is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, prbs_checker, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_prbs_checker_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_PRBS_CHECKER, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, prbs_checker, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "prbs_checker");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, prbs_checker);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, prbs_checker);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.prbs_generator.");
    if (cli_parm != NULL)
    {
        bcmolt_prbs_generator_config val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_generator.polynom");
        if (cli_parm != NULL)
        {
            val.polynom = (bcmolt_prbs_polynomial) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_generator.polynom is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_generator.error_insert");
        if (cli_parm != NULL)
        {
            val.error_insert = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_generator.error_insert is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_generator.invert");
        if (cli_parm != NULL)
        {
            val.invert = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_generator.invert is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_generator.control");
        if (cli_parm != NULL)
        {
            val.control = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_generator.control is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, prbs_generator, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_prbs_generator_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_PRBS_GENERATOR, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, prbs_generator, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "prbs_generator");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, prbs_generator);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, prbs_generator);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.prbs_status.");
    if (cli_parm != NULL)
    {
        bcmolt_prbs_status val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_status.lock_state");
        if (cli_parm != NULL)
        {
            val.lock_state = (bcmolt_prbs_lock_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_status.lock_state is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.prbs_status.error_counts");
        if (cli_parm != NULL)
        {
            val.error_counts = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.prbs_status.error_counts is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, prbs_status, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_prbs_status val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_PRBS_STATUS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, prbs_status, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "prbs_status");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, prbs_status);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, prbs_status);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.automatic_onu_deactivation.");
    if (cli_parm != NULL)
    {
        bcmolt_automatic_onu_deactivation val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.automatic_onu_deactivation.los");
        if (cli_parm != NULL)
        {
            val.los = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.automatic_onu_deactivation.los is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.automatic_onu_deactivation.onu_alarms");
        if (cli_parm != NULL)
        {
            val.onu_alarms = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.automatic_onu_deactivation.onu_alarms is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.automatic_onu_deactivation.tiwi");
        if (cli_parm != NULL)
        {
            val.tiwi = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.automatic_onu_deactivation.tiwi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.automatic_onu_deactivation.ack_timeout");
        if (cli_parm != NULL)
        {
            val.ack_timeout = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.automatic_onu_deactivation.ack_timeout is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.automatic_onu_deactivation.sfi");
        if (cli_parm != NULL)
        {
            val.sfi = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.automatic_onu_deactivation.sfi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.automatic_onu_deactivation.loki");
        if (cli_parm != NULL)
        {
            val.loki = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.automatic_onu_deactivation.loki is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, automatic_onu_deactivation, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_automatic_onu_deactivation val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_AUTOMATIC_ONU_DEACTIVATION, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, automatic_onu_deactivation, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "automatic_onu_deactivation");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, automatic_onu_deactivation);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, automatic_onu_deactivation);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.us_bandwidth_limit");
    if (cli_parm != NULL)
    {
        uint32_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, us_bandwidth_limit, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, us_bandwidth_limit, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_US_BANDWIDTH_LIMIT, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "us_bandwidth_limit");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, us_bandwidth_limit);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, us_bandwidth_limit);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.all_onus.");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_onu_with_state_list_u16_max_510 val = { };
        int32_t i2;
        val.val = apicli_byte_pool_calloc(byte_pool, cli_parm->array_size * sizeof(*val.val));
        if (val.val == NULL)
        {
            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, "filter.all_onus.onu_id");
        if (cli_parm != NULL)
        {
            if (cli_parm->array_size != val.len)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.all_onus.onu_id is a different size than other arrays in the struct\n");
                return BCM_ERR_PARM;
            }

            for (i2 = 0; i2 < val.len; i2++)
            {
                val.val[i2].onu_id = (bcmolt_xgpon_onu_id) cli_parm->values[i2].unumber;
            }
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.all_onus.state");
        if (cli_parm != NULL)
        {
            if (cli_parm->array_size != val.len)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.all_onus.state is a different size than other arrays in the struct\n");
                return BCM_ERR_PARM;
            }

            for (i2 = 0; i2 < val.len; i2++)
            {
                val.val[i2].state = (bcmolt_onu_state) cli_parm->values[i2].enum_val;
            }
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, all_onus, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_xgpon_onu_with_state_list_u16_max_510 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_ALL_ONUS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, all_onus, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "all_onus");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, all_onus);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, all_onus);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.all_mcast_gem_ports.");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_gem_port_with_state_list_u16_max_128 val = { };
        int32_t i3;
        val.val = apicli_byte_pool_calloc(byte_pool, cli_parm->array_size * sizeof(*val.val));
        if (val.val == NULL)
        {
            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, "filter.all_mcast_gem_ports.gem_id");
        if (cli_parm != NULL)
        {
            if (cli_parm->array_size != val.len)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.all_mcast_gem_ports.gem_id is a different size than other arrays in the struct\n");
                return BCM_ERR_PARM;
            }

            for (i3 = 0; i3 < val.len; i3++)
            {
                val.val[i3].gem_id = (bcmolt_xgpon_gem_id) cli_parm->values[i3].unumber;
            }
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.all_mcast_gem_ports.state");
        if (cli_parm != NULL)
        {
            if (cli_parm->array_size != val.len)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.all_mcast_gem_ports.state is a different size than other arrays in the struct\n");
                return BCM_ERR_PARM;
            }

            for (i3 = 0; i3 < val.len; i3++)
            {
                val.val[i3].state = (bcmolt_xgpon_gem_port_state) cli_parm->values[i3].enum_val;
            }
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, all_mcast_gem_ports, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_xgpon_gem_port_with_state_list_u16_max_128 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_ALL_MCAST_GEM_PORTS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, all_mcast_gem_ports, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "all_mcast_gem_ports");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, all_mcast_gem_ports);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, all_mcast_gem_ports);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.debug.");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_ni_debug val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.debug.increase_available_cbr_bw");
        if (cli_parm != NULL)
        {
            val.increase_available_cbr_bw = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.debug.increase_available_cbr_bw is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.debug.inter_burst_gap_in_bytes");
        if (cli_parm != NULL)
        {
            val.inter_burst_gap_in_bytes = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.debug.inter_burst_gap_in_bytes is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.debug.number_of_gem_ports_per_onu");
        if (cli_parm != NULL)
        {
            val.number_of_gem_ports_per_onu = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.debug.number_of_gem_ports_per_onu is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, debug, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_xgpon_ni_debug val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_DEBUG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, debug, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "debug");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, debug);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, debug);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.onu_upgrade_params.");
    if (cli_parm != NULL)
    {
        bcmolt_gpon_onu_upgrade_params val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.onu_upgrade_params.response_timeout_ms");
        if (cli_parm != NULL)
        {
            val.response_timeout_ms = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.onu_upgrade_params.response_timeout_ms is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.onu_upgrade_params.max_retry_count");
        if (cli_parm != NULL)
        {
            val.max_retry_count = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.onu_upgrade_params.max_retry_count is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.onu_upgrade_params.omci_format");
        if (cli_parm != NULL)
        {
            val.omci_format = (bcmolt_omci_device_id) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.onu_upgrade_params.omci_format is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.onu_upgrade_params.window_size");
        if (cli_parm != NULL)
        {
            val.window_size = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.onu_upgrade_params.window_size is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.onu_upgrade_params.activate_commit");
        if (cli_parm != NULL)
        {
            val.activate_commit = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.onu_upgrade_params.activate_commit is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.onu_upgrade_params.delay_for_commit_ms");
        if (cli_parm != NULL)
        {
            val.delay_for_commit_ms = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.onu_upgrade_params.delay_for_commit_ms is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.onu_upgrade_params.max_activation_attempts");
        if (cli_parm != NULL)
        {
            val.max_activation_attempts = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.onu_upgrade_params.max_activation_attempts is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, onu_upgrade_params, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_gpon_onu_upgrade_params val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_ONU_UPGRADE_PARAMS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, onu_upgrade_params, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_upgrade_params");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, onu_upgrade_params);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, onu_upgrade_params);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.ds_fec_mode");
    if (cli_parm != NULL)
    {
        bcmolt_control_state val;
        val = (bcmolt_control_state) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, ds_fec_mode, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, ds_fec_mode, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_DS_FEC_MODE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "ds_fec_mode");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, ds_fec_mode);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, ds_fec_mode);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.dba_type");
    if (cli_parm != NULL)
    {
        bcmolt_dba_type val;
        val = (bcmolt_dba_type) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, dba_type, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, dba_type, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_DBA_TYPE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "dba_type");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, dba_type);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, dba_type);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.onu_tuning.");
    if (cli_parm != NULL)
    {
        bcmolt_onu_tuning_configuration val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.onu_tuning.tsource");
        if (cli_parm != NULL)
        {
            val.tsource = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.onu_tuning.tsource is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.onu_tuning.ttarget");
        if (cli_parm != NULL)
        {
            val.ttarget = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.onu_tuning.ttarget is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.onu_tuning.request_registration_required");
        if (cli_parm != NULL)
        {
            val.request_registration_required = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.onu_tuning.request_registration_required is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, onu_tuning, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_onu_tuning_configuration val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_NI_CFG_ID_ONU_TUNING, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_ni, onu_tuning, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_tuning");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, onu_tuning);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, onu_tuning);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_ni, hw_pon_id) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_ni, available_bandwidth) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_ni, number_of_active_onus) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_ni, pon_status) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_ni, pon_distance) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_ni, ranging_window_size) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_ni, eqd_cycles_number) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_ni, drift_control) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_ni, los_alarm_threshold) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_ni, los_initial_value) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_ni, onu_alarms_thresholds) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_ni, ber_monitor) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_ni, onu_activation) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_ni, sn_acquisition) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_ni, key_exchange) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_ni, protection_switching) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_ni, protection_switching_debug) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_ni, cbr_rt_allocation_profile) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_ni, cbr_nrt_allocation_profile) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_ni, power_management) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_ni, rogue_onu_detection_process) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_ni, periodic_standby_pon_monitoring) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_ni, dba_mode) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_ni, ploam_handling) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_ni, min_data_alloc_id) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_ni, min_data_gem_port_id) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_ni, multicast_key) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_ni, prbs_checker) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_ni, prbs_generator) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_ni, prbs_status) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_ni, automatic_onu_deactivation) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_ni, us_bandwidth_limit) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_ni, all_onus) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_ni, all_mcast_gem_ports) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_ni, debug) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_ni, onu_upgrade_params) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_ni, ds_fec_mode) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_ni, dba_type) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_ni, onu_tuning))
    {
        BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, all_properties);
        bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_ni, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);
    bcmcli_log("bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_ni_stat_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_ni_stat stat;      /**< declare main API struct */
    bcmolt_xgpon_ni_key key = { };  /**< declare key */
    bcmos_bool clear_on_read;       /**< declare 'clear on read' flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_ni_stat stat;\n");
    bcmcli_log("bcmolt_xgpon_ni_key key = {  };\n");
    bcmcli_log("bcmos_bool clear_on_read;\n");
    apicli_print_start(session, "bcmolt_stat_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_NI_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* set stat flags from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "clear");
    if (cli_parm != NULL)
    {
        clear_on_read = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "clear is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("clear_on_read = %s;\n", (clear_on_read) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* init the API struct */
    BCMOLT_STAT_INIT(&stat, xgpon_ni, key);
    bcmcli_log("BCMOLT_STAT_INIT(&stat, xgpon_ni, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "fec_codewords");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, fec_codewords);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, fec_codewords);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "bip32_bytes");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, bip32_bytes);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, bip32_bytes);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "bip32_errors");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, bip32_errors);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, bip32_errors);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_xgtc_headers");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, rx_xgtc_headers);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, rx_xgtc_headers);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_xgtc_corrected");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, rx_xgtc_corrected);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, rx_xgtc_corrected);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_xgtc_uncorrected");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, rx_xgtc_uncorrected);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, rx_xgtc_uncorrected);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_xgem");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, rx_xgem);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, rx_xgem);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_xgem_dropped");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, rx_xgem_dropped);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, rx_xgem_dropped);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_xgem_idle");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, rx_xgem_idle);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, rx_xgem_idle);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_xgem_corrected");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, rx_xgem_corrected);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, rx_xgem_corrected);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_crc_error");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, rx_crc_error);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, rx_crc_error);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_fragment_error");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, rx_fragment_error);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, rx_fragment_error);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_packets_dropped");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, rx_packets_dropped);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, rx_packets_dropped);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_dropped_too_short");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, rx_dropped_too_short);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, rx_dropped_too_short);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_dropped_too_long");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, rx_dropped_too_long);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, rx_dropped_too_long);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_key_error");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, rx_key_error);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, rx_key_error);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_ploams");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, tx_ploams);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, tx_ploams);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_ploams_dropped");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, rx_ploams_dropped);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, rx_ploams_dropped);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_allocations_valid");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, rx_allocations_valid);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, rx_allocations_valid);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_allocations_invalid");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, rx_allocations_invalid);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, rx_allocations_invalid);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_allocations_disabled");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, rx_allocations_disabled);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, rx_allocations_disabled);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_ploams");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, rx_ploams);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, rx_ploams);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_ploams_non_idle");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, rx_ploams_non_idle);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, rx_ploams_non_idle);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_ploams_error");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, rx_ploams_error);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, rx_ploams_error);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_cpu");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, rx_cpu);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, rx_cpu);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_omci");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, rx_omci);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, rx_omci);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_omci_packets_crc_error");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, rx_omci_packets_crc_error);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, rx_omci_packets_crc_error);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_packets");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, tx_packets);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, tx_packets);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_xgem");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, tx_xgem);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, tx_xgem);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_cpu");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, tx_cpu);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, tx_cpu);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_omci");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, tx_omci);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, tx_omci);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_cpu_omci_packets_dropped");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, tx_cpu_omci_packets_dropped);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, tx_cpu_omci_packets_dropped);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_dropped_illegal_length");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, tx_dropped_illegal_length);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, tx_dropped_illegal_length);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_dropped_tpid_miss");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, tx_dropped_tpid_miss);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, tx_dropped_tpid_miss);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_dropped_vid_miss");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, tx_dropped_vid_miss);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, tx_dropped_vid_miss);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_ni, fec_codewords) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_ni, bip32_bytes) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_ni, bip32_errors) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_ni, rx_xgtc_headers) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_ni, rx_xgtc_corrected) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_ni, rx_xgtc_uncorrected) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_ni, rx_xgem) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_ni, rx_xgem_dropped) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_ni, rx_xgem_idle) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_ni, rx_xgem_corrected) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_ni, rx_crc_error) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_ni, rx_fragment_error) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_ni, rx_packets_dropped) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_ni, rx_dropped_too_short) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_ni, rx_dropped_too_long) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_ni, rx_key_error) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_ni, tx_ploams) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_ni, rx_ploams_dropped) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_ni, rx_allocations_valid) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_ni, rx_allocations_invalid) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_ni, rx_allocations_disabled) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_ni, rx_ploams) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_ni, rx_ploams_non_idle) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_ni, rx_ploams_error) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_ni, rx_cpu) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_ni, rx_omci) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_ni, rx_omci_packets_crc_error) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_ni, tx_packets) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_ni, tx_xgem) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_ni, tx_cpu) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_ni, tx_omci) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_ni, tx_cpu_omci_packets_dropped) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_ni, tx_dropped_illegal_length) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_ni, tx_dropped_tpid_miss) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_ni, tx_dropped_vid_miss))
    {
        BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, all_properties);
        bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_ni, all_properties);\n");
    }

    /* call API */
    err = bcmolt_stat_get(device_id, &stat.hdr, clear_on_read);
    bcmcli_log("bcmolt_stat_get(device_id, &stat.hdr, clear_on_read);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &stat.hdr.hdr);
    }

    apicli_print_complete(session, err, stat.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_ni_oper_set_pon_state_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_ni_set_pon_state oper; /**< declare main API struct */
    bcmolt_xgpon_ni_key key = { };      /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_ni_set_pon_state oper;\n");
    bcmcli_log("bcmolt_xgpon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_NI_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, xgpon_ni, set_pon_state, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, xgpon_ni, set_pon_state, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "pon_state");
    if (cli_parm != NULL)
    {
        bcmolt_pon_operation val;
        val = (bcmolt_pon_operation) cli_parm->value.enum_val;
        BCMOLT_OPER_PROP_SET(&oper, xgpon_ni, set_pon_state, pon_state, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, xgpon_ni, set_pon_state, pon_state, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_OPER, BCMOLT_XGPON_NI_OPER_ID_SET_PON_STATE, BCMOLT_XGPON_NI_SET_PON_STATE_ID_PON_STATE, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_ni_oper_reset_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_ni_reset oper;     /**< declare main API struct */
    bcmolt_xgpon_ni_key key = { };  /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_ni_reset oper;\n");
    bcmcli_log("bcmolt_xgpon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_NI_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, xgpon_ni, reset, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, xgpon_ni, reset, key);\n");

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_ni_oper_disable_serial_number_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_ni_disable_serial_number oper; /**< declare main API struct */
    bcmolt_xgpon_ni_key key = { };              /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_ni_disable_serial_number oper;\n");
    bcmcli_log("bcmolt_xgpon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_NI_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, xgpon_ni, disable_serial_number, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, xgpon_ni, disable_serial_number, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "control");
    if (cli_parm != NULL)
    {
        bcmolt_disable_serial_number_control val;
        val = (bcmolt_disable_serial_number_control) cli_parm->value.enum_val;
        BCMOLT_OPER_PROP_SET(&oper, xgpon_ni, disable_serial_number, control, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, xgpon_ni, disable_serial_number, control, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_OPER, BCMOLT_XGPON_NI_OPER_ID_DISABLE_SERIAL_NUMBER, BCMOLT_XGPON_NI_DISABLE_SERIAL_NUMBER_ID_CONTROL, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "serial_number.");
    if (cli_parm != NULL)
    {
        bcmolt_serial_number val = { };
        cli_parm = bcmcli_find_named_parm(session, "serial_number.vendor_id");
        if (cli_parm != NULL)
        {
            if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 4)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "buffer serial_number.vendor_id must have 4 bytes\n");
                return BCM_ERR_PARM;
            }

            bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
            bcmolt_buf_read(&cli_parm->value.buffer, val.vendor_id, 4);
        }
        else
        {
            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 (bcmolt_buf_get_used(&cli_parm->value.buffer) != 4)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "buffer serial_number.vendor_specific must have 4 bytes\n");
                return BCM_ERR_PARM;
            }

            bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
            bcmolt_buf_read(&cli_parm->value.buffer, val.vendor_specific, 4);
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "serial_number.vendor_specific is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_OPER_PROP_SET(&oper, xgpon_ni, disable_serial_number, serial_number, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_serial_number val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_OPER, BCMOLT_XGPON_NI_OPER_ID_DISABLE_SERIAL_NUMBER, BCMOLT_XGPON_NI_DISABLE_SERIAL_NUMBER_ID_SERIAL_NUMBER, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, xgpon_ni, disable_serial_number, serial_number, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_ni_oper_single_request_standby_pon_monitoring_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_ni_single_request_standby_pon_monitoring oper; /**< declare main API struct */
    bcmolt_xgpon_ni_key key = { };  /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_ni_single_request_standby_pon_monitoring oper;\n");
    bcmcli_log("bcmolt_xgpon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_NI_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, xgpon_ni, single_request_standby_pon_monitoring, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, xgpon_ni, single_request_standby_pon_monitoring, key);\n");

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_ni_oper_set_onu_state_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_ni_set_onu_state oper; /**< declare main API struct */
    bcmolt_xgpon_ni_key key = { };      /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_ni_set_onu_state oper;\n");
    bcmcli_log("bcmolt_xgpon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_NI_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, xgpon_ni, set_onu_state, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, xgpon_ni, set_onu_state, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "onu_state");
    if (cli_parm != NULL)
    {
        bcmolt_onu_operation val;
        val = (bcmolt_onu_operation) cli_parm->value.enum_val;
        BCMOLT_OPER_PROP_SET(&oper, xgpon_ni, set_onu_state, onu_state, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, xgpon_ni, set_onu_state, onu_state, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_OPER, BCMOLT_XGPON_NI_OPER_ID_SET_ONU_STATE, BCMOLT_XGPON_NI_SET_ONU_STATE_ID_ONU_STATE, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_ni_oper_run_special_bw_map_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_ni_run_special_bw_map oper;    /**< declare main API struct */
    bcmolt_xgpon_ni_key key = { };              /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_ni_run_special_bw_map oper;\n");
    bcmcli_log("bcmolt_xgpon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_NI_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, xgpon_ni, run_special_bw_map, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, xgpon_ni, run_special_bw_map, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "number_of_cycle");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_OPER_PROP_SET(&oper, xgpon_ni, run_special_bw_map, number_of_cycle, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, xgpon_ni, run_special_bw_map, number_of_cycle, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_OPER, BCMOLT_XGPON_NI_OPER_ID_RUN_SPECIAL_BW_MAP, BCMOLT_XGPON_NI_RUN_SPECIAL_BW_MAP_ID_NUMBER_OF_CYCLE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "allocation_number");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_OPER_PROP_SET(&oper, xgpon_ni, run_special_bw_map, allocation_number, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, xgpon_ni, run_special_bw_map, allocation_number, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_OPER, BCMOLT_XGPON_NI_OPER_ID_RUN_SPECIAL_BW_MAP, BCMOLT_XGPON_NI_RUN_SPECIAL_BW_MAP_ID_ALLOCATION_NUMBER, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "bw_map_array");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_OPER_PROP_SET(&oper, xgpon_ni, run_special_bw_map, bw_map_array, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, xgpon_ni, run_special_bw_map, bw_map_array, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_OPER, BCMOLT_XGPON_NI_OPER_ID_RUN_SPECIAL_BW_MAP, BCMOLT_XGPON_NI_RUN_SPECIAL_BW_MAP_ID_BW_MAP_ARRAY, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_ni_oper_rogue_detection_window_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_ni_rogue_detection_window oper;    /**< declare main API struct */
    bcmolt_xgpon_ni_key key = { };                  /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_ni_rogue_detection_window oper;\n");
    bcmcli_log("bcmolt_xgpon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_NI_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, xgpon_ni, rogue_detection_window, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, xgpon_ni, rogue_detection_window, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "window_type");
    if (cli_parm != NULL)
    {
        bcmolt_rogue_detection_window val;
        val = (bcmolt_rogue_detection_window) cli_parm->value.enum_val;
        BCMOLT_OPER_PROP_SET(&oper, xgpon_ni, rogue_detection_window, window_type, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, xgpon_ni, rogue_detection_window, window_type, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_OPER, BCMOLT_XGPON_NI_OPER_ID_ROGUE_DETECTION_WINDOW, BCMOLT_XGPON_NI_ROGUE_DETECTION_WINDOW_ID_WINDOW_TYPE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "alloc_id");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_alloc_id val;
        val = (bcmolt_xgpon_alloc_id) cli_parm->value.unumber;
        BCMOLT_OPER_PROP_SET(&oper, xgpon_ni, rogue_detection_window, alloc_id, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, xgpon_ni, rogue_detection_window, alloc_id, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_OPER, BCMOLT_XGPON_NI_OPER_ID_ROGUE_DETECTION_WINDOW, BCMOLT_XGPON_NI_ROGUE_DETECTION_WINDOW_ID_ALLOC_ID, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_onu_id val;
        val = (bcmolt_xgpon_onu_id) cli_parm->value.unumber;
        BCMOLT_OPER_PROP_SET(&oper, xgpon_ni, rogue_detection_window, onu_id, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, xgpon_ni, rogue_detection_window, onu_id, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_OPER, BCMOLT_XGPON_NI_OPER_ID_ROGUE_DETECTION_WINDOW, BCMOLT_XGPON_NI_ROGUE_DETECTION_WINDOW_ID_ONU_ID, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "second_ranging_window");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_OPER_PROP_SET(&oper, xgpon_ni, rogue_detection_window, second_ranging_window, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, xgpon_ni, rogue_detection_window, second_ranging_window, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_OPER, BCMOLT_XGPON_NI_OPER_ID_ROGUE_DETECTION_WINDOW, BCMOLT_XGPON_NI_ROGUE_DETECTION_WINDOW_ID_SECOND_RANGING_WINDOW, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_ni_proxy_cpu_packets_send(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_ni_cpu_packets proxy;  /**< declare main API struct */
    bcmolt_xgpon_ni_key key = { };      /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_ni_cpu_packets proxy;\n");
    bcmcli_log("bcmolt_xgpon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_proxy_send");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_NI_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_PROXY_INIT(&proxy, xgpon_ni, cpu_packets, key);
    bcmcli_log("BCMOLT_PROXY_INIT(&proxy, xgpon_ni, cpu_packets, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "packet_type");
    if (cli_parm != NULL)
    {
        bcmolt_packet_type val;
        val = (bcmolt_packet_type) cli_parm->value.enum_val;
        BCMOLT_PROXY_PROP_SET(&proxy, xgpon_ni, cpu_packets, packet_type, val);
        bcmcli_log("BCMOLT_PROXY_PROP_SET(&proxy, xgpon_ni, cpu_packets, packet_type, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_PROXY, BCMOLT_XGPON_NI_PROXY_ID_CPU_PACKETS, BCMOLT_XGPON_NI_CPU_PACKETS_ID_PACKET_TYPE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "calc_crc");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_PROXY_PROP_SET(&proxy, xgpon_ni, cpu_packets, calc_crc, val);
        bcmcli_log("BCMOLT_PROXY_PROP_SET(&proxy, xgpon_ni, cpu_packets, calc_crc, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_PROXY, BCMOLT_XGPON_NI_PROXY_ID_CPU_PACKETS, BCMOLT_XGPON_NI_CPU_PACKETS_ID_CALC_CRC, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "gem_port_list");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_gem_id_list_u8_max_16 val = { };
        int32_t i0;
        val.val = apicli_byte_pool_calloc(byte_pool, cli_parm->array_size * sizeof(*val.val));
        if (val.val == NULL)
        {
            apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
            return BCM_ERR_NOMEM;
        }

        val.len = cli_parm->array_size;
        for (i0 = 0; i0 < val.len; i0++)
        {
            val.val[i0] = (bcmolt_xgpon_gem_id) cli_parm->values[i0].unumber;
        }

        BCMOLT_PROXY_PROP_SET(&proxy, xgpon_ni, cpu_packets, gem_port_list, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_xgpon_gem_id_list_u8_max_16 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_PROXY, BCMOLT_XGPON_NI_PROXY_ID_CPU_PACKETS, BCMOLT_XGPON_NI_CPU_PACKETS_ID_GEM_PORT_LIST, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_PROXY_PROP_SET(&proxy, xgpon_ni, cpu_packets, gem_port_list, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "buffer");
    if (cli_parm != NULL)
    {
        bcmolt_u8_list_u32_max_2048 val = { };
        val.len = bcmolt_buf_get_used(&cli_parm->value.buffer);
        val.val = apicli_byte_pool_calloc(byte_pool, val.len);
        if (val.val == NULL)
        {
            apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
            return BCM_ERR_NOMEM;
        }

        bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
        bcmolt_buf_read(&cli_parm->value.buffer, val.val, val.len);
        BCMOLT_PROXY_PROP_SET(&proxy, xgpon_ni, cpu_packets, buffer, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_u8_list_u32_max_2048 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_PROXY, BCMOLT_XGPON_NI_PROXY_ID_CPU_PACKETS, BCMOLT_XGPON_NI_CPU_PACKETS_ID_BUFFER, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_PROXY_PROP_SET(&proxy, xgpon_ni, cpu_packets, buffer, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_proxy_send(device_id, &proxy.hdr);
    bcmcli_log("bcmolt_proxy_send(device_id, &proxy.hdr);\n");
    apicli_print_complete(session, err, proxy.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_ni_proxy_broadcast_ploam_packet_send(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_ni_broadcast_ploam_packet proxy;   /**< declare main API struct */
    bcmolt_xgpon_ni_key key = { };                  /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_ni_broadcast_ploam_packet proxy;\n");
    bcmcli_log("bcmolt_xgpon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_proxy_send");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_NI_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_PROXY_INIT(&proxy, xgpon_ni, broadcast_ploam_packet, key);
    bcmcli_log("BCMOLT_PROXY_INIT(&proxy, xgpon_ni, broadcast_ploam_packet, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_parm_by_prefix(session, "ploam.");
    if (cli_parm != NULL)
    {
        bcmolt_arr_u8_40 val = { };
        cli_parm = bcmcli_find_named_parm(session, "ploam.arr");
        if (cli_parm != NULL)
        {
            if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 40)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "buffer ploam.arr must have 40 bytes\n");
                return BCM_ERR_PARM;
            }

            bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
            bcmolt_buf_read(&cli_parm->value.buffer, val.arr, 40);
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ploam.arr is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_PROXY_PROP_SET(&proxy, xgpon_ni, broadcast_ploam_packet, ploam, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_arr_u8_40 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_PROXY, BCMOLT_XGPON_NI_PROXY_ID_BROADCAST_PLOAM_PACKET, BCMOLT_XGPON_NI_BROADCAST_PLOAM_PACKET_ID_PLOAM, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_PROXY_PROP_SET(&proxy, xgpon_ni, broadcast_ploam_packet, ploam, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_proxy_send(device_id, &proxy.hdr);
    bcmcli_log("bcmolt_proxy_send(device_id, &proxy.hdr);\n");
    apicli_print_complete(session, err, proxy.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_ni_oper_tod_request_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_ni_tod_request oper;   /**< declare main API struct */
    bcmolt_xgpon_ni_key key = { };      /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_ni_tod_request oper;\n");
    bcmcli_log("bcmolt_xgpon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_NI_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, xgpon_ni, tod_request, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, xgpon_ni, tod_request, key);\n");

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_ni_oper_start_onu_upgrade_submit(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_ni_start_onu_upgrade oper; /**< declare main API struct */
    bcmolt_xgpon_ni_key key = { };          /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_ni_start_onu_upgrade oper;\n");
    bcmcli_log("bcmolt_xgpon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_NI_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, xgpon_ni, start_onu_upgrade, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, xgpon_ni, start_onu_upgrade, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "list_of_onu_ids");
    if (cli_parm != NULL)
    {
        bcmolt_pon_onu_id_list_u32 val = { };
        int32_t i0;
        val.val = apicli_byte_pool_calloc(byte_pool, cli_parm->array_size * sizeof(*val.val));
        if (val.val == NULL)
        {
            apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
            return BCM_ERR_NOMEM;
        }

        val.len = cli_parm->array_size;
        for (i0 = 0; i0 < val.len; i0++)
        {
            val.val[i0] = (bcmolt_pon_onu_id) cli_parm->values[i0].unumber;
        }

        BCMOLT_OPER_PROP_SET(&oper, xgpon_ni, start_onu_upgrade, list_of_onu_ids, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_pon_onu_id_list_u32 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_OPER, BCMOLT_XGPON_NI_OPER_ID_START_ONU_UPGRADE, BCMOLT_XGPON_NI_START_ONU_UPGRADE_ID_LIST_OF_ONU_IDS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, xgpon_ni, start_onu_upgrade, list_of_onu_ids, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_ni_oper_adjust_tx_wavelength_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_ni_adjust_tx_wavelength oper;  /**< declare main API struct */
    bcmolt_xgpon_ni_key key = { };              /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_ni_adjust_tx_wavelength oper;\n");
    bcmcli_log("bcmolt_xgpon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_NI_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, xgpon_ni, adjust_tx_wavelength, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, xgpon_ni, adjust_tx_wavelength, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_parm_by_prefix(session, "serial_number.");
    if (cli_parm != NULL)
    {
        bcmolt_serial_number val = { };
        cli_parm = bcmcli_find_named_parm(session, "serial_number.vendor_id");
        if (cli_parm != NULL)
        {
            if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 4)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "buffer serial_number.vendor_id must have 4 bytes\n");
                return BCM_ERR_PARM;
            }

            bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
            bcmolt_buf_read(&cli_parm->value.buffer, val.vendor_id, 4);
        }
        else
        {
            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 (bcmolt_buf_get_used(&cli_parm->value.buffer) != 4)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "buffer serial_number.vendor_specific must have 4 bytes\n");
                return BCM_ERR_PARM;
            }

            bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
            bcmolt_buf_read(&cli_parm->value.buffer, val.vendor_specific, 4);
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "serial_number.vendor_specific is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_OPER_PROP_SET(&oper, xgpon_ni, adjust_tx_wavelength, serial_number, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_serial_number val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_OPER, BCMOLT_XGPON_NI_OPER_ID_ADJUST_TX_WAVELENGTH, BCMOLT_XGPON_NI_ADJUST_TX_WAVELENGTH_ID_SERIAL_NUMBER, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, xgpon_ni, adjust_tx_wavelength, serial_number, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "freqency_adjustment_direction");
    if (cli_parm != NULL)
    {
        bcmolt_frequency_adjustment_direction val;
        val = (bcmolt_frequency_adjustment_direction) cli_parm->value.enum_val;
        BCMOLT_OPER_PROP_SET(&oper, xgpon_ni, adjust_tx_wavelength, freqency_adjustment_direction, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, xgpon_ni, adjust_tx_wavelength, freqency_adjustment_direction, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_OPER, BCMOLT_XGPON_NI_OPER_ID_ADJUST_TX_WAVELENGTH, BCMOLT_XGPON_NI_ADJUST_TX_WAVELENGTH_ID_FREQENCY_ADJUSTMENT_DIRECTION, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "frequency_adjustment_size");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_OPER_PROP_SET(&oper, xgpon_ni, adjust_tx_wavelength, frequency_adjustment_size, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, xgpon_ni, adjust_tx_wavelength, frequency_adjustment_size, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_OPER, BCMOLT_XGPON_NI_OPER_ID_ADJUST_TX_WAVELENGTH, BCMOLT_XGPON_NI_ADJUST_TX_WAVELENGTH_ID_FREQUENCY_ADJUSTMENT_SIZE, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_ni_stat_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_ni_stat_cfg stat_cfg;  /**< declare main API struct */
    bcmolt_xgpon_ni_key key = { };      /**< declare key */
    bcmolt_xgpon_ni_stat_id stat_id;    /**< declare stat ID */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_ni_stat_cfg stat_cfg;\n");
    bcmcli_log("bcmolt_xgpon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_stat_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_NI_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* set stat ID from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "sub");
    if (cli_parm != NULL)
    {
        stat_id = (bcmolt_xgpon_ni_stat_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
        return BCM_ERR_PARM;
    }

    /* init the API struct */
    switch (stat_id)
    {
        case BCMOLT_XGPON_NI_STAT_ID_FEC_CODEWORDS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, fec_codewords, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, fec_codewords, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_BIP32_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, bip32_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, bip32_bytes, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_BIP32_ERRORS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, bip32_errors, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, bip32_errors, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_RX_XGTC_HEADERS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_xgtc_headers, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_xgtc_headers, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_RX_XGTC_CORRECTED:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_xgtc_corrected, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_xgtc_corrected, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_RX_XGTC_UNCORRECTED:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_xgtc_uncorrected, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_xgtc_uncorrected, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_RX_XGEM:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_xgem, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_xgem, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_RX_XGEM_DROPPED:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_xgem_dropped, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_xgem_dropped, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_RX_XGEM_IDLE:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_xgem_idle, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_xgem_idle, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_RX_XGEM_CORRECTED:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_xgem_corrected, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_xgem_corrected, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_RX_CRC_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_crc_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_crc_error, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_RX_FRAGMENT_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_fragment_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_fragment_error, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_RX_PACKETS_DROPPED:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_packets_dropped, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_packets_dropped, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_RX_DROPPED_TOO_SHORT:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_dropped_too_short, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_dropped_too_short, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_RX_DROPPED_TOO_LONG:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_dropped_too_long, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_dropped_too_long, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_RX_KEY_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_key_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_key_error, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_TX_PLOAMS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, tx_ploams, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, tx_ploams, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_RX_PLOAMS_DROPPED:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_ploams_dropped, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_ploams_dropped, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_RX_ALLOCATIONS_VALID:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_allocations_valid, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_allocations_valid, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_RX_ALLOCATIONS_INVALID:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_allocations_invalid, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_allocations_invalid, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_RX_ALLOCATIONS_DISABLED:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_allocations_disabled, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_allocations_disabled, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_RX_PLOAMS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_ploams, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_ploams, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_RX_PLOAMS_NON_IDLE:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_ploams_non_idle, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_ploams_non_idle, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_RX_PLOAMS_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_ploams_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_ploams_error, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_RX_CPU:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_cpu, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_cpu, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_RX_OMCI:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_omci, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_omci, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_RX_OMCI_PACKETS_CRC_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_omci_packets_crc_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_omci_packets_crc_error, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_TX_PACKETS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, tx_packets, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, tx_packets, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_TX_XGEM:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, tx_xgem, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, tx_xgem, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_TX_CPU:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, tx_cpu, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, tx_cpu, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_TX_OMCI:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, tx_omci, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, tx_omci, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_TX_CPU_OMCI_PACKETS_DROPPED:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, tx_cpu_omci_packets_dropped, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, tx_cpu_omci_packets_dropped, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_TX_DROPPED_ILLEGAL_LENGTH:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, tx_dropped_illegal_length, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, tx_dropped_illegal_length, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_TX_DROPPED_TPID_MISS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, tx_dropped_tpid_miss, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, tx_dropped_tpid_miss, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_TX_DROPPED_VID_MISS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, tx_dropped_vid_miss, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, tx_dropped_vid_miss, key);\n");
            break;
        default:
            apicli_print_complete(session, BCM_ERR_RANGE, "\n");
            return BCM_ERR_RANGE;
    }

    /* call API */
    err = bcmolt_stat_cfg_get(device_id, &stat_cfg.hdr);
    bcmcli_log("bcmolt_stat_cfg_get(device_id, &stat_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &stat_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, stat_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_ni_stat_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_ni_stat_cfg stat_cfg;  /**< declare main API struct */
    bcmolt_xgpon_ni_key key = { };      /**< declare key */
    bcmolt_xgpon_ni_stat_id stat_id;    /**< declare stat ID */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_ni_stat_cfg stat_cfg;\n");
    bcmcli_log("bcmolt_xgpon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_stat_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_NI_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* set stat ID from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "sub");
    if (cli_parm != NULL)
    {
        stat_id = (bcmolt_xgpon_ni_stat_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
        return BCM_ERR_PARM;
    }

    /* init the API struct */
    switch (stat_id)
    {
        case BCMOLT_XGPON_NI_STAT_ID_FEC_CODEWORDS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, fec_codewords, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, fec_codewords, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_BIP32_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, bip32_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, bip32_bytes, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_BIP32_ERRORS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, bip32_errors, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, bip32_errors, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_RX_XGTC_HEADERS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_xgtc_headers, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_xgtc_headers, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_RX_XGTC_CORRECTED:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_xgtc_corrected, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_xgtc_corrected, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_RX_XGTC_UNCORRECTED:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_xgtc_uncorrected, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_xgtc_uncorrected, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_RX_XGEM:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_xgem, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_xgem, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_RX_XGEM_DROPPED:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_xgem_dropped, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_xgem_dropped, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_RX_XGEM_IDLE:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_xgem_idle, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_xgem_idle, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_RX_XGEM_CORRECTED:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_xgem_corrected, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_xgem_corrected, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_RX_CRC_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_crc_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_crc_error, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_RX_FRAGMENT_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_fragment_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_fragment_error, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_RX_PACKETS_DROPPED:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_packets_dropped, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_packets_dropped, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_RX_DROPPED_TOO_SHORT:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_dropped_too_short, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_dropped_too_short, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_RX_DROPPED_TOO_LONG:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_dropped_too_long, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_dropped_too_long, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_RX_KEY_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_key_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_key_error, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_TX_PLOAMS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, tx_ploams, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, tx_ploams, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_RX_PLOAMS_DROPPED:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_ploams_dropped, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_ploams_dropped, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_RX_ALLOCATIONS_VALID:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_allocations_valid, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_allocations_valid, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_RX_ALLOCATIONS_INVALID:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_allocations_invalid, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_allocations_invalid, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_RX_ALLOCATIONS_DISABLED:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_allocations_disabled, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_allocations_disabled, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_RX_PLOAMS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_ploams, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_ploams, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_RX_PLOAMS_NON_IDLE:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_ploams_non_idle, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_ploams_non_idle, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_RX_PLOAMS_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_ploams_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_ploams_error, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_RX_CPU:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_cpu, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_cpu, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_RX_OMCI:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_omci, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_omci, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_RX_OMCI_PACKETS_CRC_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_omci_packets_crc_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, rx_omci_packets_crc_error, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_TX_PACKETS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, tx_packets, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, tx_packets, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_TX_XGEM:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, tx_xgem, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, tx_xgem, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_TX_CPU:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, tx_cpu, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, tx_cpu, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_TX_OMCI:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, tx_omci, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, tx_omci, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_TX_CPU_OMCI_PACKETS_DROPPED:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, tx_cpu_omci_packets_dropped, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, tx_cpu_omci_packets_dropped, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_TX_DROPPED_ILLEGAL_LENGTH:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, tx_dropped_illegal_length, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, tx_dropped_illegal_length, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_TX_DROPPED_TPID_MISS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, tx_dropped_tpid_miss, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, tx_dropped_tpid_miss, key);\n");
            break;
        case BCMOLT_XGPON_NI_STAT_ID_TX_DROPPED_VID_MISS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, tx_dropped_vid_miss, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_ni, tx_dropped_vid_miss, key);\n");
            break;
        default:
            apicli_print_complete(session, BCM_ERR_RANGE, "\n");
            return BCM_ERR_RANGE;
    }

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.");
    if (cli_parm != NULL)
    {
        bcmolt_stat_alarm_config val = { };
        cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.trigger.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.type");
            if (cli_parm != NULL)
            {
                val.trigger.type = (bcmolt_stat_condition_type) cli_parm->value.enum_val;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.type is not set\n");
                return BCM_ERR_PARM;
            }

            switch (val.trigger.type)
            {
                case BCMOLT_STAT_CONDITION_TYPE_RATE_THRESHOLD:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.rising");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_threshold.rising = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.rising is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.falling");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_threshold.falling = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.falling is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_RATE_RANGE:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.upper");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_range.upper = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.upper is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.lower");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_range.lower = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.lower is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_VALUE_THRESHOLD:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.limit");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.value_threshold.limit = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.limit is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_NONE:
                    break;
                default:
                    apicli_print_complete(session, BCM_ERR_RANGE, "\n");
                    return BCM_ERR_RANGE;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.soak.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "cfg.soak.active_soak_time");
            if (cli_parm != NULL)
            {
                val.soak.active_soak_time = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak.active_soak_time is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "cfg.soak.clear_soak_time");
            if (cli_parm != NULL)
            {
                val.soak.clear_soak_time = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak.clear_soak_time is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_STAT_CFG_PROP_SET(&stat_cfg, xgpon_ni, cfg, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_stat_alarm_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_STAT_CFG, 0, BCMOLT_XGPON_NI_STAT_CFG_ID_CFG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_STAT_CFG_PROP_SET(&stat_cfg, xgpon_ni, cfg, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_stat_cfg_set(device_id, &stat_cfg.hdr);
    bcmcli_log("bcmolt_stat_cfg_set(device_id, &stat_cfg.hdr);\n");
    apicli_print_complete(session, err, stat_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_ni_auto_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_ni_auto_cfg auto_cfg;  /**< declare main API struct */
    bcmolt_xgpon_ni_key key = { };      /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_ni_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_xgpon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_get");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, xgpon_ni, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, xgpon_ni, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "activate_all_onus_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_ni, activate_all_onus_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_ni, activate_all_onus_completed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "cpu_packets_failure");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_ni, cpu_packets_failure);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_ni, cpu_packets_failure);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "deactivate_all_onus_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_ni, deactivate_all_onus_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_ni, deactivate_all_onus_completed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "disable_all_onus_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_ni, disable_all_onus_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_ni, disable_all_onus_completed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "enable_all_onus_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_ni, enable_all_onus_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_ni, enable_all_onus_completed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "los");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_ni, los);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_ni, los);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_discovered");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_ni, onu_discovered);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_ni, onu_discovered);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_upgrade_complete");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_ni, onu_upgrade_complete);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_ni, onu_upgrade_complete);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "protection_switching_onus_ranged");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_ni, protection_switching_onus_ranged);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_ni, protection_switching_onus_ranged);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "protection_switching_switchover_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_ni, protection_switching_switchover_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_ni, protection_switching_switchover_completed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "protection_switching_traffic_resume");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_ni, protection_switching_traffic_resume);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_ni, protection_switching_traffic_resume);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rogue_detection_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_ni, rogue_detection_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_ni, rogue_detection_completed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rogue_onu_special_map_cycle_start");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_ni, rogue_onu_special_map_cycle_start);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_ni, rogue_onu_special_map_cycle_start);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "serial_number_acquisition_cycle_start");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_ni, serial_number_acquisition_cycle_start);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_ni, serial_number_acquisition_cycle_start);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "standby_pon_monitoring_cycle_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_ni, standby_pon_monitoring_cycle_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_ni, standby_pon_monitoring_cycle_completed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_cleared");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_ni, stat_alarm_cleared);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_ni, stat_alarm_cleared);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_raised");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_ni, stat_alarm_raised);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_ni, stat_alarm_raised);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "state_change_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_ni, state_change_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_ni, state_change_completed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tod_request_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_ni, tod_request_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_ni, tod_request_completed);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_ni, activate_all_onus_completed) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_ni, cpu_packets_failure) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_ni, deactivate_all_onus_completed) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_ni, disable_all_onus_completed) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_ni, enable_all_onus_completed) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_ni, los) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_ni, onu_discovered) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_ni, onu_upgrade_complete) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_ni, protection_switching_onus_ranged) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_ni, protection_switching_switchover_completed) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_ni, protection_switching_traffic_resume) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_ni, rogue_detection_completed) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_ni, rogue_onu_special_map_cycle_start) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_ni, serial_number_acquisition_cycle_start) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_ni, standby_pon_monitoring_cycle_completed) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_ni, stat_alarm_cleared) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_ni, stat_alarm_raised) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_ni, state_change_completed) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_ni, tod_request_completed))
    {
        BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_ni, all_properties);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_ni, all_properties);\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &auto_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_ni_auto_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_ni_auto_cfg auto_cfg;  /**< declare main API struct */
    bcmolt_xgpon_ni_key key = { };      /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_ni_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_xgpon_ni_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_set");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, xgpon_ni, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, xgpon_ni, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "activate_all_onus_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_ni, activate_all_onus_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_ni, activate_all_onus_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_NI_AUTO_CFG_ID_ACTIVATE_ALL_ONUS_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "cpu_packets_failure");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_ni, cpu_packets_failure, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_ni, cpu_packets_failure, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_NI_AUTO_CFG_ID_CPU_PACKETS_FAILURE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "deactivate_all_onus_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_ni, deactivate_all_onus_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_ni, deactivate_all_onus_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_NI_AUTO_CFG_ID_DEACTIVATE_ALL_ONUS_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "disable_all_onus_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_ni, disable_all_onus_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_ni, disable_all_onus_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_NI_AUTO_CFG_ID_DISABLE_ALL_ONUS_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "enable_all_onus_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_ni, enable_all_onus_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_ni, enable_all_onus_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_NI_AUTO_CFG_ID_ENABLE_ALL_ONUS_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "los");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_ni, los, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_ni, los, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_NI_AUTO_CFG_ID_LOS, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_discovered");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_ni, onu_discovered, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_ni, onu_discovered, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_NI_AUTO_CFG_ID_ONU_DISCOVERED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_upgrade_complete");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_ni, onu_upgrade_complete, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_ni, onu_upgrade_complete, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_NI_AUTO_CFG_ID_ONU_UPGRADE_COMPLETE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "protection_switching_onus_ranged");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_ni, protection_switching_onus_ranged, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_ni, protection_switching_onus_ranged, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_ONUS_RANGED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "protection_switching_switchover_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_ni, protection_switching_switchover_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_ni, protection_switching_switchover_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "protection_switching_traffic_resume");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_ni, protection_switching_traffic_resume, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_ni, protection_switching_traffic_resume, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_TRAFFIC_RESUME, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rogue_detection_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_ni, rogue_detection_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_ni, rogue_detection_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_NI_AUTO_CFG_ID_ROGUE_DETECTION_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rogue_onu_special_map_cycle_start");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_ni, rogue_onu_special_map_cycle_start, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_ni, rogue_onu_special_map_cycle_start, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_NI_AUTO_CFG_ID_ROGUE_ONU_SPECIAL_MAP_CYCLE_START, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "serial_number_acquisition_cycle_start");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_ni, serial_number_acquisition_cycle_start, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_ni, serial_number_acquisition_cycle_start, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_NI_AUTO_CFG_ID_SERIAL_NUMBER_ACQUISITION_CYCLE_START, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "standby_pon_monitoring_cycle_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_ni, standby_pon_monitoring_cycle_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_ni, standby_pon_monitoring_cycle_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_NI_AUTO_CFG_ID_STANDBY_PON_MONITORING_CYCLE_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_cleared");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_ni, stat_alarm_cleared, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_ni, stat_alarm_cleared, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_NI_AUTO_CFG_ID_STAT_ALARM_CLEARED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_raised");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_ni, stat_alarm_raised, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_ni, stat_alarm_raised, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_NI_AUTO_CFG_ID_STAT_ALARM_RAISED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "state_change_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_ni, state_change_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_ni, state_change_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_NI_AUTO_CFG_ID_STATE_CHANGE_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "tod_request_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_ni, tod_request_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_ni, tod_request_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_NI_AUTO_CFG_ID_TOD_REQUEST_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);\n");
    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_onu_cfg_get(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_onu_cfg cfg;       /**< declare main API struct */
    bcmolt_xgpon_onu_key key = { }; /**< declare key */
    uint8_t *list_mem;              /**< declare memory buffer for variable-sized lists */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_onu_cfg cfg;\n");
    bcmcli_log("bcmolt_xgpon_onu_key key = {  };\n");
    bcmcli_log("uint8_t* list_mem;\n");
    apicli_print_start(session, "bcmolt_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ONU_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        key.onu_id = (bcmolt_xgpon_onu_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "onu_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.onu_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ONU_KEY_ID_ONU_ID, &key.onu_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, xgpon_onu, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, xgpon_onu, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "onu_state");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_onu, onu_state);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_onu, onu_state);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_old_state");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_onu, onu_old_state);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_onu, onu_old_state);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "alarm_state");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_onu, alarm_state);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_onu, alarm_state);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "registration_encryption_keys");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_onu, registration_encryption_keys);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_onu, registration_encryption_keys);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "current_encryption_key");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_onu, current_encryption_key);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_onu, current_encryption_key);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "serial_number");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_onu, serial_number);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_onu, serial_number);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "registration_id");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_onu, registration_id);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_onu, registration_id);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "registration_id_auto_learning");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_onu, registration_id_auto_learning);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_onu, registration_id_auto_learning);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "ranging_burst_profile");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_onu, ranging_burst_profile);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_onu, ranging_burst_profile);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "data_burst_profile");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_onu, data_burst_profile);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_onu, data_burst_profile);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "ranging_time");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_onu, ranging_time);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_onu, ranging_time);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "disabled_after_discovery");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_onu, disabled_after_discovery);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_onu, disabled_after_discovery);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "deactivation_reason");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_onu, deactivation_reason);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_onu, deactivation_reason);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "all_gem_ports");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_onu, all_gem_ports);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_onu, all_gem_ports);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "all_allocs");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_onu, all_allocs);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_onu, all_allocs);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "extended_guard_time");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_onu, extended_guard_time);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_onu, extended_guard_time);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "us_line_rate");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_onu, us_line_rate);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_onu, us_line_rate);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "calibration_record");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_onu, calibration_record);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_onu, calibration_record);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tuning_granularity");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_onu, tuning_granularity);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_onu, tuning_granularity);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "step_tuning_time");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_onu, step_tuning_time);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_onu, step_tuning_time);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "power_levelling_capabilities");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_onu, power_levelling_capabilities);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_onu, power_levelling_capabilities);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "request_registration_status");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_onu, request_registration_status);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_onu, request_registration_status);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_onu, onu_state) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_onu, onu_old_state) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_onu, alarm_state) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_onu, registration_encryption_keys) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_onu, current_encryption_key) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_onu, serial_number) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_onu, registration_id) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_onu, registration_id_auto_learning) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_onu, ranging_burst_profile) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_onu, data_burst_profile) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_onu, ranging_time) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_onu, disabled_after_discovery) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_onu, deactivation_reason) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_onu, all_gem_ports) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_onu, all_allocs) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_onu, extended_guard_time) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_onu, us_line_rate) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_onu, calibration_record) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_onu, tuning_granularity) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_onu, step_tuning_time) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_onu, power_levelling_capabilities) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_onu, request_registration_status))
    {
        BCMOLT_CFG_PROP_GET(&cfg, xgpon_onu, all_properties);
        bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_onu, all_properties);\n");
    }

    /* set memory to use for variable-sized lists */
    list_mem = apicli_byte_pool_calloc(byte_pool, APICLI_DYNAMIC_LIST_BUFFER_SIZE);
    if (list_mem == NULL)
    {
        apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
        return BCM_ERR_NOMEM;
    }

    bcmcli_log("list_mem = bcmos_calloc(APICLI_DYNAMIC_LIST_BUFFER_SIZE);\n");
    BCMOLT_CFG_LIST_BUF_SET(&cfg, xgpon_onu, list_mem, APICLI_DYNAMIC_LIST_BUFFER_SIZE);
    bcmcli_log("BCMOLT_CFG_LIST_BUF_SET(&cfg, xgpon_onu, list_mem, APICLI_DYNAMIC_LIST_BUFFER_SIZE);\n");

    /* call API */
    err = bcmolt_cfg_get(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_get(device_id, &cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_onu_cfg_set(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_onu_cfg cfg;       /**< declare main API struct */
    bcmolt_xgpon_onu_key key = { }; /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_onu_cfg cfg;\n");
    bcmcli_log("bcmolt_xgpon_onu_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ONU_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        key.onu_id = (bcmolt_xgpon_onu_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "onu_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.onu_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ONU_KEY_ID_ONU_ID, &key.onu_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, xgpon_onu, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, xgpon_onu, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "onu_state");
    if (cli_parm != NULL)
    {
        bcmolt_onu_state val;
        val = (bcmolt_onu_state) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, onu_state, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, onu_state, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_ONU_CFG_ID_ONU_STATE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "alarm_state.");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_onu_alarm_state val = { };
        cli_parm = bcmcli_find_named_parm(session, "alarm_state.losi");
        if (cli_parm != NULL)
        {
            val.losi = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "alarm_state.losi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "alarm_state.lobi");
        if (cli_parm != NULL)
        {
            val.lobi = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "alarm_state.lobi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "alarm_state.lopci");
        if (cli_parm != NULL)
        {
            val.lopci = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "alarm_state.lopci is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "alarm_state.lopci_mic_error");
        if (cli_parm != NULL)
        {
            val.lopci_mic_error = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "alarm_state.lopci_mic_error is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "alarm_state.looci");
        if (cli_parm != NULL)
        {
            val.looci = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "alarm_state.looci is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "alarm_state.tiwi");
        if (cli_parm != NULL)
        {
            val.tiwi = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "alarm_state.tiwi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "alarm_state.dowi");
        if (cli_parm != NULL)
        {
            val.dowi = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "alarm_state.dowi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "alarm_state.sufi");
        if (cli_parm != NULL)
        {
            val.sufi = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "alarm_state.sufi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "alarm_state.sfi");
        if (cli_parm != NULL)
        {
            val.sfi = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "alarm_state.sfi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "alarm_state.sdi");
        if (cli_parm != NULL)
        {
            val.sdi = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "alarm_state.sdi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "alarm_state.dfi");
        if (cli_parm != NULL)
        {
            val.dfi = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "alarm_state.dfi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "alarm_state.dgi");
        if (cli_parm != NULL)
        {
            val.dgi = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "alarm_state.dgi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "alarm_state.pqsi");
        if (cli_parm != NULL)
        {
            val.pqsi = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "alarm_state.pqsi is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, alarm_state, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_xgpon_onu_alarm_state val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_ONU_CFG_ID_ALARM_STATE, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, alarm_state, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "registration_encryption_keys.");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_onu_registration_keys val = { };
        cli_parm = bcmcli_find_parm_by_prefix(session, "registration_encryption_keys.ploam_ik.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "registration_encryption_keys.ploam_ik.bytes");
            if (cli_parm != NULL)
            {
                if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 16)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "buffer registration_encryption_keys.ploam_ik.bytes must have 16 bytes\n");
                    return BCM_ERR_PARM;
                }

                bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
                bcmolt_buf_read(&cli_parm->value.buffer, val.ploam_ik.bytes, 16);
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "registration_encryption_keys.ploam_ik.bytes is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "registration_encryption_keys.ploam_ik is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "registration_encryption_keys.omci_ik.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "registration_encryption_keys.omci_ik.bytes");
            if (cli_parm != NULL)
            {
                if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 16)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "buffer registration_encryption_keys.omci_ik.bytes must have 16 bytes\n");
                    return BCM_ERR_PARM;
                }

                bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
                bcmolt_buf_read(&cli_parm->value.buffer, val.omci_ik.bytes, 16);
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "registration_encryption_keys.omci_ik.bytes is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "registration_encryption_keys.omci_ik is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "registration_encryption_keys.omci_k1.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "registration_encryption_keys.omci_k1.bytes");
            if (cli_parm != NULL)
            {
                if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 16)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "buffer registration_encryption_keys.omci_k1.bytes must have 16 bytes\n");
                    return BCM_ERR_PARM;
                }

                bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
                bcmolt_buf_read(&cli_parm->value.buffer, val.omci_k1.bytes, 16);
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "registration_encryption_keys.omci_k1.bytes is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "registration_encryption_keys.omci_k1 is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "registration_encryption_keys.omci_k2.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "registration_encryption_keys.omci_k2.bytes");
            if (cli_parm != NULL)
            {
                if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 16)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "buffer registration_encryption_keys.omci_k2.bytes must have 16 bytes\n");
                    return BCM_ERR_PARM;
                }

                bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
                bcmolt_buf_read(&cli_parm->value.buffer, val.omci_k2.bytes, 16);
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "registration_encryption_keys.omci_k2.bytes is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "registration_encryption_keys.omci_k2 is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "registration_encryption_keys.kek.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "registration_encryption_keys.kek.bytes");
            if (cli_parm != NULL)
            {
                if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 16)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "buffer registration_encryption_keys.kek.bytes must have 16 bytes\n");
                    return BCM_ERR_PARM;
                }

                bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
                bcmolt_buf_read(&cli_parm->value.buffer, val.kek.bytes, 16);
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "registration_encryption_keys.kek.bytes is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "registration_encryption_keys.kek is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, registration_encryption_keys, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_xgpon_onu_registration_keys val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_ONU_CFG_ID_REGISTRATION_ENCRYPTION_KEYS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, registration_encryption_keys, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "current_encryption_key.");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_onu_aes_key val = { };
        cli_parm = bcmcli_find_parm_by_prefix(session, "current_encryption_key.encryption_key.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "current_encryption_key.encryption_key.bytes");
            if (cli_parm != NULL)
            {
                if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 16)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "buffer current_encryption_key.encryption_key.bytes must have 16 bytes\n");
                    return BCM_ERR_PARM;
                }

                bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
                bcmolt_buf_read(&cli_parm->value.buffer, val.encryption_key.bytes, 16);
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "current_encryption_key.encryption_key.bytes is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "current_encryption_key.encryption_key is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "current_encryption_key.key_index");
        if (cli_parm != NULL)
        {
            val.key_index = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "current_encryption_key.key_index is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, current_encryption_key, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_xgpon_onu_aes_key val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_ONU_CFG_ID_CURRENT_ENCRYPTION_KEY, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, current_encryption_key, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "serial_number.");
    if (cli_parm != NULL)
    {
        bcmolt_serial_number val = { };
        cli_parm = bcmcli_find_named_parm(session, "serial_number.vendor_id");
        if (cli_parm != NULL)
        {
            if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 4)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "buffer serial_number.vendor_id must have 4 bytes\n");
                return BCM_ERR_PARM;
            }

            bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
            bcmolt_buf_read(&cli_parm->value.buffer, val.vendor_id, 4);
        }
        else
        {
            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 (bcmolt_buf_get_used(&cli_parm->value.buffer) != 4)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "buffer serial_number.vendor_specific must have 4 bytes\n");
                return BCM_ERR_PARM;
            }

            bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
            bcmolt_buf_read(&cli_parm->value.buffer, val.vendor_specific, 4);
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "serial_number.vendor_specific is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, serial_number, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_serial_number val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_ONU_CFG_ID_SERIAL_NUMBER, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, serial_number, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "registration_id.");
    if (cli_parm != NULL)
    {
        bcmolt_arr_u8_36 val = { };
        cli_parm = bcmcli_find_named_parm(session, "registration_id.arr");
        if (cli_parm != NULL)
        {
            if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 36)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "buffer registration_id.arr must have 36 bytes\n");
                return BCM_ERR_PARM;
            }

            bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
            bcmolt_buf_read(&cli_parm->value.buffer, val.arr, 36);
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "registration_id.arr is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, registration_id, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_arr_u8_36 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_ONU_CFG_ID_REGISTRATION_ID, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, registration_id, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "registration_id_auto_learning");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, registration_id_auto_learning, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, registration_id_auto_learning, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_ONU_CFG_ID_REGISTRATION_ID_AUTO_LEARNING, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "ranging_burst_profile");
    if (cli_parm != NULL)
    {
        bcmolt_burst_profile_index val;
        val = (bcmolt_burst_profile_index) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, ranging_burst_profile, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, ranging_burst_profile, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_ONU_CFG_ID_RANGING_BURST_PROFILE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "data_burst_profile");
    if (cli_parm != NULL)
    {
        bcmolt_burst_profile_index val;
        val = (bcmolt_burst_profile_index) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, data_burst_profile, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, data_burst_profile, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_ONU_CFG_ID_DATA_BURST_PROFILE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "ranging_time");
    if (cli_parm != NULL)
    {
        uint32_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, ranging_time, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, ranging_time, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_ONU_CFG_ID_RANGING_TIME, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "extended_guard_time.");
    if (cli_parm != NULL)
    {
        bcmolt_extended_guard_time val = { };
        cli_parm = bcmcli_find_named_parm(session, "extended_guard_time.additional_preburst_guard_time");
        if (cli_parm != NULL)
        {
            val.additional_preburst_guard_time = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "extended_guard_time.additional_preburst_guard_time is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "extended_guard_time.additional_postburst_guard_time");
        if (cli_parm != NULL)
        {
            val.additional_postburst_guard_time = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "extended_guard_time.additional_postburst_guard_time is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, extended_guard_time, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_extended_guard_time val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_ONU_CFG_ID_EXTENDED_GUARD_TIME, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, extended_guard_time, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "us_line_rate");
    if (cli_parm != NULL)
    {
        bcmolt_upstream_line_rate_capabilities val;
        val = (bcmolt_upstream_line_rate_capabilities) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, us_line_rate, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, us_line_rate, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_ONU_CFG_ID_US_LINE_RATE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "calibration_record.");
    if (cli_parm != NULL)
    {
        bcmolt_arr_calibration_record_8 val = { };
        cli_parm = bcmcli_find_named_parm(session, "calibration_record.arr");
        if (cli_parm != NULL)
        {
            int32_t i0;
            if (cli_parm->array_size != 8)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "array calibration_record.arr must have 8 elements\n");
                return BCM_ERR_PARM;
            }

            for (i0 = 0; i0 < 8; i0++)
            {
                val.arr[i0] = (bcmolt_calibration_record) cli_parm->values[i0].enum_val;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "calibration_record.arr is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, calibration_record, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_arr_calibration_record_8 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_ONU_CFG_ID_CALIBRATION_RECORD, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, calibration_record, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "tuning_granularity");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, tuning_granularity, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, tuning_granularity, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_ONU_CFG_ID_TUNING_GRANULARITY, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "step_tuning_time");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, step_tuning_time, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, step_tuning_time, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_ONU_CFG_ID_STEP_TUNING_TIME, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "power_levelling_capabilities");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, power_levelling_capabilities, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, power_levelling_capabilities, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_ONU_CFG_ID_POWER_LEVELLING_CAPABILITIES, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_cfg_set(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_set(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_onu_cfg_clear(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_onu_cfg cfg;       /**< declare main API struct */
    bcmolt_xgpon_onu_key key = { }; /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_onu_cfg cfg;\n");
    bcmcli_log("bcmolt_xgpon_onu_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_clear");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ONU_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        key.onu_id = (bcmolt_xgpon_onu_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "onu_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.onu_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ONU_KEY_ID_ONU_ID, &key.onu_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, xgpon_onu, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, xgpon_onu, key);\n");

    /* call API */
    err = bcmolt_cfg_clear(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_clear(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_onu_cfg_get_multi(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_onu_cfg cfg;       /**< declare main API struct */
    bcmolt_xgpon_onu_key key = { }; /**< declare key */
    bcmolt_msg_set *msg_set = NULL; /**< declare message set */
    uint32_t max_msgs;              /**< declare max number of msgs to get */
    bcmos_bool invert_filter;       /**< declare filter invert flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_onu_cfg cfg;\n");
    bcmcli_log("bcmolt_xgpon_onu_key key = {  };\n");
    bcmcli_log("bcmolt_msg_set* msg_set = NULL;\n");
    bcmcli_log("uint32_t max_msgs;\n");
    bcmcli_log("bcmos_bool invert_filter;\n");
    apicli_print_start(session, "bcmolt_cfg_get_multi");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ONU_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        key.onu_id = (bcmolt_xgpon_onu_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "onu_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.onu_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ONU_KEY_ID_ONU_ID, &key.onu_id);
    bcmcli_log(";\n");

    /* set max number of msgs from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "max_msgs");
    if (cli_parm != NULL)
    {
        max_msgs = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "max_msgs is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("max_msgs = %d;\n", max_msgs);

    /* set filter invert flag from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "filter_invert");
    if (cli_parm != NULL)
    {
        invert_filter = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "filter_invert is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("invert_filter = %s;\n", (invert_filter) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* allocate message set */
    err = apicli_msg_set_alloc(byte_pool, BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);
    if (err != BCM_ERR_OK)
    {
        return err;
    }

    bcmcli_log("bcmolt_msg_set_alloc(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, xgpon_onu, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, xgpon_onu, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "filter.onu_state");
    if (cli_parm != NULL)
    {
        bcmolt_onu_state val;
        val = (bcmolt_onu_state) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, onu_state, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, onu_state, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_ONU_CFG_ID_ONU_STATE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_state");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_onu, onu_state);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_onu, onu_state);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.onu_old_state");
    if (cli_parm != NULL)
    {
        bcmolt_onu_state val;
        val = (bcmolt_onu_state) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, onu_old_state, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, onu_old_state, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_ONU_CFG_ID_ONU_OLD_STATE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_old_state");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_onu, onu_old_state);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_onu, onu_old_state);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.alarm_state.");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_onu_alarm_state val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.alarm_state.losi");
        if (cli_parm != NULL)
        {
            val.losi = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.losi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.alarm_state.lobi");
        if (cli_parm != NULL)
        {
            val.lobi = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.lobi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.alarm_state.lopci");
        if (cli_parm != NULL)
        {
            val.lopci = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.lopci is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.alarm_state.lopci_mic_error");
        if (cli_parm != NULL)
        {
            val.lopci_mic_error = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.lopci_mic_error is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.alarm_state.looci");
        if (cli_parm != NULL)
        {
            val.looci = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.looci is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.alarm_state.tiwi");
        if (cli_parm != NULL)
        {
            val.tiwi = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.tiwi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.alarm_state.dowi");
        if (cli_parm != NULL)
        {
            val.dowi = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.dowi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.alarm_state.sufi");
        if (cli_parm != NULL)
        {
            val.sufi = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.sufi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.alarm_state.sfi");
        if (cli_parm != NULL)
        {
            val.sfi = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.sfi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.alarm_state.sdi");
        if (cli_parm != NULL)
        {
            val.sdi = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.sdi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.alarm_state.dfi");
        if (cli_parm != NULL)
        {
            val.dfi = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.dfi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.alarm_state.dgi");
        if (cli_parm != NULL)
        {
            val.dgi = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.dgi is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.alarm_state.pqsi");
        if (cli_parm != NULL)
        {
            val.pqsi = (bcmolt_status) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.alarm_state.pqsi is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, alarm_state, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_xgpon_onu_alarm_state val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_ONU_CFG_ID_ALARM_STATE, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, alarm_state, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "alarm_state");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_onu, alarm_state);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_onu, alarm_state);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.registration_encryption_keys.");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_onu_registration_keys val = { };
        cli_parm = bcmcli_find_parm_by_prefix(session, "filter.registration_encryption_keys.ploam_ik.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "filter.registration_encryption_keys.ploam_ik.bytes");
            if (cli_parm != NULL)
            {
                if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 16)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "buffer filter.registration_encryption_keys.ploam_ik.bytes must have 16 bytes\n");
                    return BCM_ERR_PARM;
                }

                bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
                bcmolt_buf_read(&cli_parm->value.buffer, val.ploam_ik.bytes, 16);
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.registration_encryption_keys.ploam_ik.bytes is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.registration_encryption_keys.ploam_ik is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "filter.registration_encryption_keys.omci_ik.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "filter.registration_encryption_keys.omci_ik.bytes");
            if (cli_parm != NULL)
            {
                if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 16)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "buffer filter.registration_encryption_keys.omci_ik.bytes must have 16 bytes\n");
                    return BCM_ERR_PARM;
                }

                bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
                bcmolt_buf_read(&cli_parm->value.buffer, val.omci_ik.bytes, 16);
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.registration_encryption_keys.omci_ik.bytes is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.registration_encryption_keys.omci_ik is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "filter.registration_encryption_keys.omci_k1.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "filter.registration_encryption_keys.omci_k1.bytes");
            if (cli_parm != NULL)
            {
                if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 16)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "buffer filter.registration_encryption_keys.omci_k1.bytes must have 16 bytes\n");
                    return BCM_ERR_PARM;
                }

                bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
                bcmolt_buf_read(&cli_parm->value.buffer, val.omci_k1.bytes, 16);
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.registration_encryption_keys.omci_k1.bytes is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.registration_encryption_keys.omci_k1 is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "filter.registration_encryption_keys.omci_k2.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "filter.registration_encryption_keys.omci_k2.bytes");
            if (cli_parm != NULL)
            {
                if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 16)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "buffer filter.registration_encryption_keys.omci_k2.bytes must have 16 bytes\n");
                    return BCM_ERR_PARM;
                }

                bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
                bcmolt_buf_read(&cli_parm->value.buffer, val.omci_k2.bytes, 16);
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.registration_encryption_keys.omci_k2.bytes is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.registration_encryption_keys.omci_k2 is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "filter.registration_encryption_keys.kek.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "filter.registration_encryption_keys.kek.bytes");
            if (cli_parm != NULL)
            {
                if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 16)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "buffer filter.registration_encryption_keys.kek.bytes must have 16 bytes\n");
                    return BCM_ERR_PARM;
                }

                bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
                bcmolt_buf_read(&cli_parm->value.buffer, val.kek.bytes, 16);
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.registration_encryption_keys.kek.bytes is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.registration_encryption_keys.kek is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, registration_encryption_keys, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_xgpon_onu_registration_keys val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_ONU_CFG_ID_REGISTRATION_ENCRYPTION_KEYS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, registration_encryption_keys, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "registration_encryption_keys");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_onu, registration_encryption_keys);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_onu, registration_encryption_keys);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.current_encryption_key.");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_onu_aes_key val = { };
        cli_parm = bcmcli_find_parm_by_prefix(session, "filter.current_encryption_key.encryption_key.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "filter.current_encryption_key.encryption_key.bytes");
            if (cli_parm != NULL)
            {
                if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 16)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "buffer filter.current_encryption_key.encryption_key.bytes must have 16 bytes\n");
                    return BCM_ERR_PARM;
                }

                bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
                bcmolt_buf_read(&cli_parm->value.buffer, val.encryption_key.bytes, 16);
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.current_encryption_key.encryption_key.bytes is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.current_encryption_key.encryption_key is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.current_encryption_key.key_index");
        if (cli_parm != NULL)
        {
            val.key_index = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.current_encryption_key.key_index is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, current_encryption_key, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_xgpon_onu_aes_key val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_ONU_CFG_ID_CURRENT_ENCRYPTION_KEY, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, current_encryption_key, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "current_encryption_key");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_onu, current_encryption_key);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_onu, current_encryption_key);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.serial_number.");
    if (cli_parm != NULL)
    {
        bcmolt_serial_number val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.serial_number.vendor_id");
        if (cli_parm != NULL)
        {
            if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 4)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "buffer filter.serial_number.vendor_id must have 4 bytes\n");
                return BCM_ERR_PARM;
            }

            bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
            bcmolt_buf_read(&cli_parm->value.buffer, val.vendor_id, 4);
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.serial_number.vendor_id is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.serial_number.vendor_specific");
        if (cli_parm != NULL)
        {
            if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 4)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "buffer filter.serial_number.vendor_specific must have 4 bytes\n");
                return BCM_ERR_PARM;
            }

            bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
            bcmolt_buf_read(&cli_parm->value.buffer, val.vendor_specific, 4);
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.serial_number.vendor_specific is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, serial_number, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_serial_number val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_ONU_CFG_ID_SERIAL_NUMBER, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, serial_number, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "serial_number");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_onu, serial_number);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_onu, serial_number);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.registration_id.");
    if (cli_parm != NULL)
    {
        bcmolt_arr_u8_36 val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.registration_id.arr");
        if (cli_parm != NULL)
        {
            if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 36)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "buffer filter.registration_id.arr must have 36 bytes\n");
                return BCM_ERR_PARM;
            }

            bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
            bcmolt_buf_read(&cli_parm->value.buffer, val.arr, 36);
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.registration_id.arr is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, registration_id, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_arr_u8_36 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_ONU_CFG_ID_REGISTRATION_ID, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, registration_id, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "registration_id");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_onu, registration_id);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_onu, registration_id);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.registration_id_auto_learning");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, registration_id_auto_learning, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, registration_id_auto_learning, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_ONU_CFG_ID_REGISTRATION_ID_AUTO_LEARNING, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "registration_id_auto_learning");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_onu, registration_id_auto_learning);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_onu, registration_id_auto_learning);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.ranging_burst_profile");
    if (cli_parm != NULL)
    {
        bcmolt_burst_profile_index val;
        val = (bcmolt_burst_profile_index) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, ranging_burst_profile, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, ranging_burst_profile, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_ONU_CFG_ID_RANGING_BURST_PROFILE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "ranging_burst_profile");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_onu, ranging_burst_profile);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_onu, ranging_burst_profile);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.data_burst_profile");
    if (cli_parm != NULL)
    {
        bcmolt_burst_profile_index val;
        val = (bcmolt_burst_profile_index) cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, data_burst_profile, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, data_burst_profile, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_ONU_CFG_ID_DATA_BURST_PROFILE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "data_burst_profile");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_onu, data_burst_profile);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_onu, data_burst_profile);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.ranging_time");
    if (cli_parm != NULL)
    {
        uint32_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, ranging_time, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, ranging_time, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_ONU_CFG_ID_RANGING_TIME, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "ranging_time");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_onu, ranging_time);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_onu, ranging_time);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.disabled_after_discovery");
    if (cli_parm != NULL)
    {
        bcmolt_status val;
        val = (bcmolt_status) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, disabled_after_discovery, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, disabled_after_discovery, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_ONU_CFG_ID_DISABLED_AFTER_DISCOVERY, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "disabled_after_discovery");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_onu, disabled_after_discovery);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_onu, disabled_after_discovery);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.deactivation_reason");
    if (cli_parm != NULL)
    {
        bcmolt_deactivation_reason val;
        val = (bcmolt_deactivation_reason) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, deactivation_reason, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, deactivation_reason, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_ONU_CFG_ID_DEACTIVATION_REASON, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "deactivation_reason");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_onu, deactivation_reason);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_onu, deactivation_reason);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.all_gem_ports.");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_gem_port_with_state_list_u16_max_256 val = { };
        int32_t i0;
        val.val = apicli_byte_pool_calloc(byte_pool, cli_parm->array_size * sizeof(*val.val));
        if (val.val == NULL)
        {
            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, "filter.all_gem_ports.gem_id");
        if (cli_parm != NULL)
        {
            if (cli_parm->array_size != val.len)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.all_gem_ports.gem_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].gem_id = (bcmolt_xgpon_gem_id) cli_parm->values[i0].unumber;
            }
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.all_gem_ports.state");
        if (cli_parm != NULL)
        {
            if (cli_parm->array_size != val.len)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.all_gem_ports.state 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].state = (bcmolt_xgpon_gem_port_state) cli_parm->values[i0].enum_val;
            }
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, all_gem_ports, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_xgpon_gem_port_with_state_list_u16_max_256 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_ONU_CFG_ID_ALL_GEM_PORTS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, all_gem_ports, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "all_gem_ports");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_onu, all_gem_ports);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_onu, all_gem_ports);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.all_allocs.");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_alloc_with_state_list_u16_max_32 val = { };
        int32_t i1;
        val.val = apicli_byte_pool_calloc(byte_pool, cli_parm->array_size * sizeof(*val.val));
        if (val.val == NULL)
        {
            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, "filter.all_allocs.alloc_id");
        if (cli_parm != NULL)
        {
            if (cli_parm->array_size != val.len)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.all_allocs.alloc_id is a different size than other arrays in the struct\n");
                return BCM_ERR_PARM;
            }

            for (i1 = 0; i1 < val.len; i1++)
            {
                val.val[i1].alloc_id = (bcmolt_xgpon_alloc_id) cli_parm->values[i1].unumber;
            }
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.all_allocs.state");
        if (cli_parm != NULL)
        {
            if (cli_parm->array_size != val.len)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "filter.all_allocs.state is a different size than other arrays in the struct\n");
                return BCM_ERR_PARM;
            }

            for (i1 = 0; i1 < val.len; i1++)
            {
                val.val[i1].state = (bcmolt_alloc_state) cli_parm->values[i1].enum_val;
            }
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, all_allocs, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_xgpon_alloc_with_state_list_u16_max_32 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_ONU_CFG_ID_ALL_ALLOCS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, all_allocs, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "all_allocs");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_onu, all_allocs);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_onu, all_allocs);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.extended_guard_time.");
    if (cli_parm != NULL)
    {
        bcmolt_extended_guard_time val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.extended_guard_time.additional_preburst_guard_time");
        if (cli_parm != NULL)
        {
            val.additional_preburst_guard_time = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.extended_guard_time.additional_preburst_guard_time is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.extended_guard_time.additional_postburst_guard_time");
        if (cli_parm != NULL)
        {
            val.additional_postburst_guard_time = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.extended_guard_time.additional_postburst_guard_time is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, extended_guard_time, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_extended_guard_time val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_ONU_CFG_ID_EXTENDED_GUARD_TIME, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, extended_guard_time, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "extended_guard_time");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_onu, extended_guard_time);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_onu, extended_guard_time);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.us_line_rate");
    if (cli_parm != NULL)
    {
        bcmolt_upstream_line_rate_capabilities val;
        val = (bcmolt_upstream_line_rate_capabilities) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, us_line_rate, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, us_line_rate, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_ONU_CFG_ID_US_LINE_RATE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "us_line_rate");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_onu, us_line_rate);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_onu, us_line_rate);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.calibration_record.");
    if (cli_parm != NULL)
    {
        bcmolt_arr_calibration_record_8 val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.calibration_record.arr");
        if (cli_parm != NULL)
        {
            int32_t i2;
            if (cli_parm->array_size != 8)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "array filter.calibration_record.arr must have 8 elements\n");
                return BCM_ERR_PARM;
            }

            for (i2 = 0; i2 < 8; i2++)
            {
                val.arr[i2] = (bcmolt_calibration_record) cli_parm->values[i2].enum_val;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.calibration_record.arr is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, calibration_record, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_arr_calibration_record_8 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_ONU_CFG_ID_CALIBRATION_RECORD, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, calibration_record, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "calibration_record");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_onu, calibration_record);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_onu, calibration_record);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.tuning_granularity");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, tuning_granularity, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, tuning_granularity, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_ONU_CFG_ID_TUNING_GRANULARITY, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "tuning_granularity");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_onu, tuning_granularity);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_onu, tuning_granularity);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.step_tuning_time");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, step_tuning_time, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, step_tuning_time, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_ONU_CFG_ID_STEP_TUNING_TIME, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "step_tuning_time");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_onu, step_tuning_time);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_onu, step_tuning_time);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.power_levelling_capabilities");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, power_levelling_capabilities, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, power_levelling_capabilities, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_ONU_CFG_ID_POWER_LEVELLING_CAPABILITIES, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "power_levelling_capabilities");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_onu, power_levelling_capabilities);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_onu, power_levelling_capabilities);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.request_registration_status.");
    if (cli_parm != NULL)
    {
        bcmolt_request_registration_status val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.request_registration_status.request_registration_state");
        if (cli_parm != NULL)
        {
            val.request_registration_state = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.request_registration_status.request_registration_state is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.request_registration_status.sma_flag");
        if (cli_parm != NULL)
        {
            val.sma_flag = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.request_registration_status.sma_flag is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, request_registration_status, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_request_registration_status val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_ONU_CFG_ID_REQUEST_REGISTRATION_STATUS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_onu, request_registration_status, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "request_registration_status");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_onu, request_registration_status);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_onu, request_registration_status);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_onu, onu_state) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_onu, onu_old_state) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_onu, alarm_state) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_onu, registration_encryption_keys) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_onu, current_encryption_key) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_onu, serial_number) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_onu, registration_id) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_onu, registration_id_auto_learning) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_onu, ranging_burst_profile) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_onu, data_burst_profile) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_onu, ranging_time) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_onu, disabled_after_discovery) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_onu, deactivation_reason) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_onu, all_gem_ports) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_onu, all_allocs) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_onu, extended_guard_time) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_onu, us_line_rate) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_onu, calibration_record) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_onu, tuning_granularity) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_onu, step_tuning_time) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_onu, power_levelling_capabilities) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_onu, request_registration_status))
    {
        BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_onu, all_properties);
        bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_onu, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);
    bcmcli_log("bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_onu_stat_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_onu_stat stat;     /**< declare main API struct */
    bcmolt_xgpon_onu_key key = { }; /**< declare key */
    bcmos_bool clear_on_read;       /**< declare 'clear on read' flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_onu_stat stat;\n");
    bcmcli_log("bcmolt_xgpon_onu_key key = {  };\n");
    bcmcli_log("bcmos_bool clear_on_read;\n");
    apicli_print_start(session, "bcmolt_stat_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ONU_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        key.onu_id = (bcmolt_xgpon_onu_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "onu_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.onu_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ONU_KEY_ID_ONU_ID, &key.onu_id);
    bcmcli_log(";\n");

    /* set stat flags from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "clear");
    if (cli_parm != NULL)
    {
        clear_on_read = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "clear is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("clear_on_read = %s;\n", (clear_on_read) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* init the API struct */
    BCMOLT_STAT_INIT(&stat, xgpon_onu, key);
    bcmcli_log("BCMOLT_STAT_INIT(&stat, xgpon_onu, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "positive_drift");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_onu, positive_drift);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_onu, positive_drift);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "negative_drift");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_onu, negative_drift);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_onu, negative_drift);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "delimiter_miss_detection");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_onu, delimiter_miss_detection);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_onu, delimiter_miss_detection);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "bip32_errors");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_onu, bip32_errors);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_onu, bip32_errors);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_words");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_onu, rx_words);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_onu, rx_words);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "fec_corrected_symbols");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_onu, fec_corrected_symbols);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_onu, fec_corrected_symbols);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "fec_corrected_codewords");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_onu, fec_corrected_codewords);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_onu, fec_corrected_codewords);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "fec_uncorrectable_codewords");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_onu, fec_uncorrectable_codewords);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_onu, fec_uncorrectable_codewords);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "fec_codewords");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_onu, fec_codewords);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_onu, fec_codewords);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "fec_corrected_bits");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_onu, fec_corrected_bits);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_onu, fec_corrected_bits);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "xgem_key_errors");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_onu, xgem_key_errors);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_onu, xgem_key_errors);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "xgem_loss");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_onu, xgem_loss);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_onu, xgem_loss);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_ploams_mic_error");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_onu, rx_ploams_mic_error);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_onu, rx_ploams_mic_error);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_ploams_non_idle");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_onu, rx_ploams_non_idle);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_onu, rx_ploams_non_idle);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_omci");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_onu, rx_omci);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_onu, rx_omci);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_omci_packets_crc_error");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_onu, rx_omci_packets_crc_error);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_onu, rx_omci_packets_crc_error);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_bytes");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_onu, rx_bytes);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_onu, rx_bytes);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_packets");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_onu, rx_packets);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_onu, rx_packets);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_bytes");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_onu, tx_bytes);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_onu, tx_bytes);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_packets");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_STAT_PROP_GET(&stat, xgpon_onu, tx_packets);
            bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_onu, tx_packets);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_onu, positive_drift) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_onu, negative_drift) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_onu, delimiter_miss_detection) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_onu, bip32_errors) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_onu, rx_words) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_onu, fec_corrected_symbols) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_onu, fec_corrected_codewords) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_onu, fec_uncorrectable_codewords) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_onu, fec_codewords) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_onu, fec_corrected_bits) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_onu, xgem_key_errors) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_onu, xgem_loss) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_onu, rx_ploams_mic_error) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_onu, rx_ploams_non_idle) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_onu, rx_omci) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_onu, rx_omci_packets_crc_error) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_onu, rx_bytes) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_onu, rx_packets) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_onu, tx_bytes) && !BCMOLT_STAT_PROP_IS_SET(&stat, xgpon_onu, tx_packets))
    {
        BCMOLT_STAT_PROP_GET(&stat, xgpon_onu, all_properties);
        bcmcli_log("BCMOLT_STAT_PROP_GET(&stat, xgpon_onu, all_properties);\n");
    }

    /* call API */
    err = bcmolt_stat_get(device_id, &stat.hdr, clear_on_read);
    bcmcli_log("bcmolt_stat_get(device_id, &stat.hdr, clear_on_read);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &stat.hdr.hdr);
    }

    apicli_print_complete(session, err, stat.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_onu_oper_set_onu_state_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_onu_set_onu_state oper;    /**< declare main API struct */
    bcmolt_xgpon_onu_key key = { };         /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_onu_set_onu_state oper;\n");
    bcmcli_log("bcmolt_xgpon_onu_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ONU_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        key.onu_id = (bcmolt_xgpon_onu_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "onu_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.onu_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ONU_KEY_ID_ONU_ID, &key.onu_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, xgpon_onu, set_onu_state, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, xgpon_onu, set_onu_state, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "onu_state");
    if (cli_parm != NULL)
    {
        bcmolt_onu_operation val;
        val = (bcmolt_onu_operation) cli_parm->value.enum_val;
        BCMOLT_OPER_PROP_SET(&oper, xgpon_onu, set_onu_state, onu_state, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, xgpon_onu, set_onu_state, onu_state, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_OPER, BCMOLT_XGPON_ONU_OPER_ID_SET_ONU_STATE, BCMOLT_XGPON_ONU_SET_ONU_STATE_ID_ONU_STATE, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_onu_oper_rssi_measurement_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_onu_rssi_measurement oper; /**< declare main API struct */
    bcmolt_xgpon_onu_key key = { };         /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_onu_rssi_measurement oper;\n");
    bcmcli_log("bcmolt_xgpon_onu_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ONU_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        key.onu_id = (bcmolt_xgpon_onu_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "onu_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.onu_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ONU_KEY_ID_ONU_ID, &key.onu_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, xgpon_onu, rssi_measurement, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, xgpon_onu, rssi_measurement, key);\n");

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_onu_proxy_ploam_packet_send(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_onu_ploam_packet proxy;    /**< declare main API struct */
    bcmolt_xgpon_onu_key key = { };         /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_onu_ploam_packet proxy;\n");
    bcmcli_log("bcmolt_xgpon_onu_key key = {  };\n");
    apicli_print_start(session, "bcmolt_proxy_send");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ONU_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        key.onu_id = (bcmolt_xgpon_onu_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "onu_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.onu_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ONU_KEY_ID_ONU_ID, &key.onu_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_PROXY_INIT(&proxy, xgpon_onu, ploam_packet, key);
    bcmcli_log("BCMOLT_PROXY_INIT(&proxy, xgpon_onu, ploam_packet, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "default_key");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_PROXY_PROP_SET(&proxy, xgpon_onu, ploam_packet, default_key, val);
        bcmcli_log("BCMOLT_PROXY_PROP_SET(&proxy, xgpon_onu, ploam_packet, default_key, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_PROXY, BCMOLT_XGPON_ONU_PROXY_ID_PLOAM_PACKET, BCMOLT_XGPON_ONU_PLOAM_PACKET_ID_DEFAULT_KEY, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "ploam.");
    if (cli_parm != NULL)
    {
        bcmolt_arr_u8_40 val = { };
        cli_parm = bcmcli_find_named_parm(session, "ploam.arr");
        if (cli_parm != NULL)
        {
            if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 40)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "buffer ploam.arr must have 40 bytes\n");
                return BCM_ERR_PARM;
            }

            bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
            bcmolt_buf_read(&cli_parm->value.buffer, val.arr, 40);
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ploam.arr is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_PROXY_PROP_SET(&proxy, xgpon_onu, ploam_packet, ploam, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_arr_u8_40 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_PROXY, BCMOLT_XGPON_ONU_PROXY_ID_PLOAM_PACKET, BCMOLT_XGPON_ONU_PLOAM_PACKET_ID_PLOAM, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_PROXY_PROP_SET(&proxy, xgpon_onu, ploam_packet, ploam, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_proxy_send(device_id, &proxy.hdr);
    bcmcli_log("bcmolt_proxy_send(device_id, &proxy.hdr);\n");
    apicli_print_complete(session, err, proxy.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_onu_proxy_cpu_packets_send(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_onu_cpu_packets proxy; /**< declare main API struct */
    bcmolt_xgpon_onu_key key = { };     /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_onu_cpu_packets proxy;\n");
    bcmcli_log("bcmolt_xgpon_onu_key key = {  };\n");
    apicli_print_start(session, "bcmolt_proxy_send");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ONU_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        key.onu_id = (bcmolt_xgpon_onu_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "onu_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.onu_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ONU_KEY_ID_ONU_ID, &key.onu_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_PROXY_INIT(&proxy, xgpon_onu, cpu_packets, key);
    bcmcli_log("BCMOLT_PROXY_INIT(&proxy, xgpon_onu, cpu_packets, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "packet_type");
    if (cli_parm != NULL)
    {
        bcmolt_packet_type val;
        val = (bcmolt_packet_type) cli_parm->value.enum_val;
        BCMOLT_PROXY_PROP_SET(&proxy, xgpon_onu, cpu_packets, packet_type, val);
        bcmcli_log("BCMOLT_PROXY_PROP_SET(&proxy, xgpon_onu, cpu_packets, packet_type, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_PROXY, BCMOLT_XGPON_ONU_PROXY_ID_CPU_PACKETS, BCMOLT_XGPON_ONU_CPU_PACKETS_ID_PACKET_TYPE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "calc_crc");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_PROXY_PROP_SET(&proxy, xgpon_onu, cpu_packets, calc_crc, val);
        bcmcli_log("BCMOLT_PROXY_PROP_SET(&proxy, xgpon_onu, cpu_packets, calc_crc, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_PROXY, BCMOLT_XGPON_ONU_PROXY_ID_CPU_PACKETS, BCMOLT_XGPON_ONU_CPU_PACKETS_ID_CALC_CRC, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "number_of_packets");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_PROXY_PROP_SET(&proxy, xgpon_onu, cpu_packets, number_of_packets, val);
        bcmcli_log("BCMOLT_PROXY_PROP_SET(&proxy, xgpon_onu, cpu_packets, number_of_packets, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_PROXY, BCMOLT_XGPON_ONU_PROXY_ID_CPU_PACKETS, BCMOLT_XGPON_ONU_CPU_PACKETS_ID_NUMBER_OF_PACKETS, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "packet_size");
    if (cli_parm != NULL)
    {
        uint16_t val;
        val = cli_parm->value.unumber;
        BCMOLT_PROXY_PROP_SET(&proxy, xgpon_onu, cpu_packets, packet_size, val);
        bcmcli_log("BCMOLT_PROXY_PROP_SET(&proxy, xgpon_onu, cpu_packets, packet_size, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_PROXY, BCMOLT_XGPON_ONU_PROXY_ID_CPU_PACKETS, BCMOLT_XGPON_ONU_CPU_PACKETS_ID_PACKET_SIZE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "buffer");
    if (cli_parm != NULL)
    {
        bcmolt_u8_list_u32_max_2048 val = { };
        val.len = bcmolt_buf_get_used(&cli_parm->value.buffer);
        val.val = apicli_byte_pool_calloc(byte_pool, val.len);
        if (val.val == NULL)
        {
            apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
            return BCM_ERR_NOMEM;
        }

        bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
        bcmolt_buf_read(&cli_parm->value.buffer, val.val, val.len);
        BCMOLT_PROXY_PROP_SET(&proxy, xgpon_onu, cpu_packets, buffer, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_u8_list_u32_max_2048 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_PROXY, BCMOLT_XGPON_ONU_PROXY_ID_CPU_PACKETS, BCMOLT_XGPON_ONU_CPU_PACKETS_ID_BUFFER, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_PROXY_PROP_SET(&proxy, xgpon_onu, cpu_packets, buffer, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_proxy_send(device_id, &proxy.hdr);
    bcmcli_log("bcmolt_proxy_send(device_id, &proxy.hdr);\n");
    apicli_print_complete(session, err, proxy.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_onu_oper_request_registration_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_onu_request_registration oper; /**< declare main API struct */
    bcmolt_xgpon_onu_key key = { };             /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_onu_request_registration oper;\n");
    bcmcli_log("bcmolt_xgpon_onu_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ONU_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        key.onu_id = (bcmolt_xgpon_onu_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "onu_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.onu_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ONU_KEY_ID_ONU_ID, &key.onu_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, xgpon_onu, request_registration, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, xgpon_onu, request_registration, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "sma_flag");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_OPER_PROP_SET(&oper, xgpon_onu, request_registration, sma_flag, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, xgpon_onu, request_registration, sma_flag, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_OPER, BCMOLT_XGPON_ONU_OPER_ID_REQUEST_REGISTRATION, BCMOLT_XGPON_ONU_REQUEST_REGISTRATION_ID_SMA_FLAG, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_onu_oper_change_power_levelling_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_onu_change_power_levelling oper;   /**< declare main API struct */
    bcmolt_xgpon_onu_key key = { };                 /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_onu_change_power_levelling oper;\n");
    bcmcli_log("bcmolt_xgpon_onu_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ONU_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        key.onu_id = (bcmolt_xgpon_onu_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "onu_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.onu_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ONU_KEY_ID_ONU_ID, &key.onu_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, xgpon_onu, change_power_levelling, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, xgpon_onu, change_power_levelling, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "control");
    if (cli_parm != NULL)
    {
        bcmolt_power_levelling_control val;
        val = (bcmolt_power_levelling_control) cli_parm->value.enum_val;
        BCMOLT_OPER_PROP_SET(&oper, xgpon_onu, change_power_levelling, control, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, xgpon_onu, change_power_levelling, control, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_OPER, BCMOLT_XGPON_ONU_OPER_ID_CHANGE_POWER_LEVELLING, BCMOLT_XGPON_ONU_CHANGE_POWER_LEVELLING_ID_CONTROL, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "attenuation");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_OPER_PROP_SET(&oper, xgpon_onu, change_power_levelling, attenuation, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, xgpon_onu, change_power_levelling, attenuation, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_OPER, BCMOLT_XGPON_ONU_OPER_ID_CHANGE_POWER_LEVELLING, BCMOLT_XGPON_ONU_CHANGE_POWER_LEVELLING_ID_ATTENUATION, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_onu_oper_get_power_level_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_onu_get_power_level oper;  /**< declare main API struct */
    bcmolt_xgpon_onu_key key = { };         /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_onu_get_power_level oper;\n");
    bcmcli_log("bcmolt_xgpon_onu_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ONU_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        key.onu_id = (bcmolt_xgpon_onu_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "onu_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.onu_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ONU_KEY_ID_ONU_ID, &key.onu_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, xgpon_onu, get_power_level, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, xgpon_onu, get_power_level, key);\n");

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_onu_oper_get_power_consumption_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_onu_get_power_consumption oper;    /**< declare main API struct */
    bcmolt_xgpon_onu_key key = { };                 /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_onu_get_power_consumption oper;\n");
    bcmcli_log("bcmolt_xgpon_onu_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ONU_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        key.onu_id = (bcmolt_xgpon_onu_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "onu_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.onu_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ONU_KEY_ID_ONU_ID, &key.onu_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, xgpon_onu, get_power_consumption, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, xgpon_onu, get_power_consumption, key);\n");

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_onu_oper_adjust_tx_wavelength_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_onu_adjust_tx_wavelength oper; /**< declare main API struct */
    bcmolt_xgpon_onu_key key = { };             /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_onu_adjust_tx_wavelength oper;\n");
    bcmcli_log("bcmolt_xgpon_onu_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ONU_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        key.onu_id = (bcmolt_xgpon_onu_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "onu_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.onu_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ONU_KEY_ID_ONU_ID, &key.onu_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, xgpon_onu, adjust_tx_wavelength, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, xgpon_onu, adjust_tx_wavelength, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "frequency_adjustment_direction");
    if (cli_parm != NULL)
    {
        bcmolt_frequency_adjustment_direction val;
        val = (bcmolt_frequency_adjustment_direction) cli_parm->value.enum_val;
        BCMOLT_OPER_PROP_SET(&oper, xgpon_onu, adjust_tx_wavelength, frequency_adjustment_direction, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, xgpon_onu, adjust_tx_wavelength, frequency_adjustment_direction, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_OPER, BCMOLT_XGPON_ONU_OPER_ID_ADJUST_TX_WAVELENGTH, BCMOLT_XGPON_ONU_ADJUST_TX_WAVELENGTH_ID_FREQUENCY_ADJUSTMENT_DIRECTION, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "frequency_adjustment_size");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_OPER_PROP_SET(&oper, xgpon_onu, adjust_tx_wavelength, frequency_adjustment_size, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, xgpon_onu, adjust_tx_wavelength, frequency_adjustment_size, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_OPER, BCMOLT_XGPON_ONU_OPER_ID_ADJUST_TX_WAVELENGTH, BCMOLT_XGPON_ONU_ADJUST_TX_WAVELENGTH_ID_FREQUENCY_ADJUSTMENT_SIZE, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_onu_oper_secure_mutual_authentication_submit(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_onu_secure_mutual_authentication oper; /**< declare main API struct */
    bcmolt_xgpon_onu_key key = { };                     /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_onu_secure_mutual_authentication oper;\n");
    bcmcli_log("bcmolt_xgpon_onu_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ONU_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        key.onu_id = (bcmolt_xgpon_onu_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "onu_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.onu_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ONU_KEY_ID_ONU_ID, &key.onu_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, xgpon_onu, secure_mutual_authentication, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, xgpon_onu, secure_mutual_authentication, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_parm_by_prefix(session, "master_key.");
    if (cli_parm != NULL)
    {
        bcmolt_aes_key val = { };
        cli_parm = bcmcli_find_named_parm(session, "master_key.bytes");
        if (cli_parm != NULL)
        {
            if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 16)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "buffer master_key.bytes must have 16 bytes\n");
                return BCM_ERR_PARM;
            }

            bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
            bcmolt_buf_read(&cli_parm->value.buffer, val.bytes, 16);
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "master_key.bytes is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_OPER_PROP_SET(&oper, xgpon_onu, secure_mutual_authentication, master_key, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_aes_key val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_OPER, BCMOLT_XGPON_ONU_OPER_ID_SECURE_MUTUAL_AUTHENTICATION, BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_ID_MASTER_KEY, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, xgpon_onu, secure_mutual_authentication, master_key, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "buffer");
    if (cli_parm != NULL)
    {
        bcmolt_u8_list_u32_max_2048 val = { };
        val.len = bcmolt_buf_get_used(&cli_parm->value.buffer);
        val.val = apicli_byte_pool_calloc(byte_pool, val.len);
        if (val.val == NULL)
        {
            apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
            return BCM_ERR_NOMEM;
        }

        bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
        bcmolt_buf_read(&cli_parm->value.buffer, val.val, val.len);
        BCMOLT_OPER_PROP_SET(&oper, xgpon_onu, secure_mutual_authentication, buffer, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_u8_list_u32_max_2048 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_OPER, BCMOLT_XGPON_ONU_OPER_ID_SECURE_MUTUAL_AUTHENTICATION, BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_ID_BUFFER, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, xgpon_onu, secure_mutual_authentication, buffer, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "mic");
    if (cli_parm != NULL)
    {
        uint32_t val;
        val = cli_parm->value.unumber;
        BCMOLT_OPER_PROP_SET(&oper, xgpon_onu, secure_mutual_authentication, mic, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, xgpon_onu, secure_mutual_authentication, mic, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_OPER, BCMOLT_XGPON_ONU_OPER_ID_SECURE_MUTUAL_AUTHENTICATION, BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_ID_MIC, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_onu_oper_onu_tuning_in_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_onu_onu_tuning_in oper;    /**< declare main API struct */
    bcmolt_xgpon_onu_key key = { };         /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_onu_onu_tuning_in oper;\n");
    bcmcli_log("bcmolt_xgpon_onu_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ONU_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        key.onu_id = (bcmolt_xgpon_onu_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "onu_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.onu_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ONU_KEY_ID_ONU_ID, &key.onu_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, xgpon_onu, onu_tuning_in, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, xgpon_onu, onu_tuning_in, key);\n");

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_onu_oper_onu_tuning_out_submit(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_onu_onu_tuning_out oper;   /**< declare main API struct */
    bcmolt_xgpon_onu_key key = { };         /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_onu_onu_tuning_out oper;\n");
    bcmcli_log("bcmolt_xgpon_onu_key key = {  };\n");
    apicli_print_start(session, "bcmolt_oper_submit");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ONU_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        key.onu_id = (bcmolt_xgpon_onu_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "onu_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.onu_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ONU_KEY_ID_ONU_ID, &key.onu_id);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_OPER_INIT(&oper, xgpon_onu, onu_tuning_out, key);
    bcmcli_log("BCMOLT_OPER_INIT(&oper, xgpon_onu, onu_tuning_out, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_parm_by_prefix(session, "target_ds_pon_id.");
    if (cli_parm != NULL)
    {
        bcmolt_pon_id val = { };
        cli_parm = bcmcli_find_named_parm(session, "target_ds_pon_id.administrative_label");
        if (cli_parm != NULL)
        {
            val.administrative_label = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "target_ds_pon_id.administrative_label is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "target_ds_pon_id.dwlch_id");
        if (cli_parm != NULL)
        {
            val.dwlch_id = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "target_ds_pon_id.dwlch_id is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_OPER_PROP_SET(&oper, xgpon_onu, onu_tuning_out, target_ds_pon_id, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_pon_id val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_OPER, BCMOLT_XGPON_ONU_OPER_ID_ONU_TUNING_OUT, BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_TARGET_DS_PON_ID, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, xgpon_onu, onu_tuning_out, target_ds_pon_id, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "target_us_pon_id.");
    if (cli_parm != NULL)
    {
        bcmolt_pon_id val = { };
        cli_parm = bcmcli_find_named_parm(session, "target_us_pon_id.administrative_label");
        if (cli_parm != NULL)
        {
            val.administrative_label = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "target_us_pon_id.administrative_label is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "target_us_pon_id.dwlch_id");
        if (cli_parm != NULL)
        {
            val.dwlch_id = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "target_us_pon_id.dwlch_id is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_OPER_PROP_SET(&oper, xgpon_onu, onu_tuning_out, target_us_pon_id, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_pon_id val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_OPER, BCMOLT_XGPON_ONU_OPER_ID_ONU_TUNING_OUT, BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_TARGET_US_PON_ID, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, xgpon_onu, onu_tuning_out, target_us_pon_id, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "time_to_switch");
    if (cli_parm != NULL)
    {
        uint32_t val;
        val = cli_parm->value.unumber;
        BCMOLT_OPER_PROP_SET(&oper, xgpon_onu, onu_tuning_out, time_to_switch, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, xgpon_onu, onu_tuning_out, time_to_switch, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_OPER, BCMOLT_XGPON_ONU_OPER_ID_ONU_TUNING_OUT, BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_TIME_TO_SWITCH, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rollback");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_OPER_PROP_SET(&oper, xgpon_onu, onu_tuning_out, rollback, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, xgpon_onu, onu_tuning_out, rollback, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_OPER, BCMOLT_XGPON_ONU_OPER_ID_ONU_TUNING_OUT, BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_ROLLBACK, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "status");
    if (cli_parm != NULL)
    {
        bcmolt_status val;
        val = (bcmolt_status) cli_parm->value.enum_val;
        BCMOLT_OPER_PROP_SET(&oper, xgpon_onu, onu_tuning_out, status, val);
        bcmcli_log("BCMOLT_OPER_PROP_SET(&oper, xgpon_onu, onu_tuning_out, status, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_OPER, BCMOLT_XGPON_ONU_OPER_ID_ONU_TUNING_OUT, BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_STATUS, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_oper_submit(device_id, &oper.hdr);
    bcmcli_log("bcmolt_oper_submit(device_id, &oper.hdr);\n");
    apicli_print_complete(session, err, oper.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_onu_stat_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_onu_stat_cfg stat_cfg; /**< declare main API struct */
    bcmolt_xgpon_onu_key key = { };     /**< declare key */
    bcmolt_xgpon_onu_stat_id stat_id;   /**< declare stat ID */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_onu_stat_cfg stat_cfg;\n");
    bcmcli_log("bcmolt_xgpon_onu_key key = {  };\n");
    apicli_print_start(session, "bcmolt_stat_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ONU_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        key.onu_id = (bcmolt_xgpon_onu_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "onu_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.onu_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ONU_KEY_ID_ONU_ID, &key.onu_id);
    bcmcli_log(";\n");

    /* set stat ID from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "sub");
    if (cli_parm != NULL)
    {
        stat_id = (bcmolt_xgpon_onu_stat_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
        return BCM_ERR_PARM;
    }

    /* init the API struct */
    switch (stat_id)
    {
        case BCMOLT_XGPON_ONU_STAT_ID_POSITIVE_DRIFT:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, positive_drift, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, positive_drift, key);\n");
            break;
        case BCMOLT_XGPON_ONU_STAT_ID_NEGATIVE_DRIFT:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, negative_drift, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, negative_drift, key);\n");
            break;
        case BCMOLT_XGPON_ONU_STAT_ID_DELIMITER_MISS_DETECTION:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, delimiter_miss_detection, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, delimiter_miss_detection, key);\n");
            break;
        case BCMOLT_XGPON_ONU_STAT_ID_BIP32_ERRORS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, bip32_errors, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, bip32_errors, key);\n");
            break;
        case BCMOLT_XGPON_ONU_STAT_ID_RX_WORDS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, rx_words, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, rx_words, key);\n");
            break;
        case BCMOLT_XGPON_ONU_STAT_ID_FEC_CORRECTED_SYMBOLS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, fec_corrected_symbols, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, fec_corrected_symbols, key);\n");
            break;
        case BCMOLT_XGPON_ONU_STAT_ID_FEC_CORRECTED_CODEWORDS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, fec_corrected_codewords, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, fec_corrected_codewords, key);\n");
            break;
        case BCMOLT_XGPON_ONU_STAT_ID_FEC_UNCORRECTABLE_CODEWORDS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, fec_uncorrectable_codewords, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, fec_uncorrectable_codewords, key);\n");
            break;
        case BCMOLT_XGPON_ONU_STAT_ID_FEC_CODEWORDS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, fec_codewords, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, fec_codewords, key);\n");
            break;
        case BCMOLT_XGPON_ONU_STAT_ID_FEC_CORRECTED_BITS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, fec_corrected_bits, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, fec_corrected_bits, key);\n");
            break;
        case BCMOLT_XGPON_ONU_STAT_ID_XGEM_KEY_ERRORS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, xgem_key_errors, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, xgem_key_errors, key);\n");
            break;
        case BCMOLT_XGPON_ONU_STAT_ID_XGEM_LOSS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, xgem_loss, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, xgem_loss, key);\n");
            break;
        case BCMOLT_XGPON_ONU_STAT_ID_RX_PLOAMS_MIC_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, rx_ploams_mic_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, rx_ploams_mic_error, key);\n");
            break;
        case BCMOLT_XGPON_ONU_STAT_ID_RX_PLOAMS_NON_IDLE:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, rx_ploams_non_idle, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, rx_ploams_non_idle, key);\n");
            break;
        case BCMOLT_XGPON_ONU_STAT_ID_RX_OMCI:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, rx_omci, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, rx_omci, key);\n");
            break;
        case BCMOLT_XGPON_ONU_STAT_ID_RX_OMCI_PACKETS_CRC_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, rx_omci_packets_crc_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, rx_omci_packets_crc_error, key);\n");
            break;
        case BCMOLT_XGPON_ONU_STAT_ID_RX_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, rx_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, rx_bytes, key);\n");
            break;
        case BCMOLT_XGPON_ONU_STAT_ID_RX_PACKETS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, rx_packets, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, rx_packets, key);\n");
            break;
        case BCMOLT_XGPON_ONU_STAT_ID_TX_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, tx_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, tx_bytes, key);\n");
            break;
        case BCMOLT_XGPON_ONU_STAT_ID_TX_PACKETS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, tx_packets, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, tx_packets, key);\n");
            break;
        default:
            apicli_print_complete(session, BCM_ERR_RANGE, "\n");
            return BCM_ERR_RANGE;
    }

    /* call API */
    err = bcmolt_stat_cfg_get(device_id, &stat_cfg.hdr);
    bcmcli_log("bcmolt_stat_cfg_get(device_id, &stat_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &stat_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, stat_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_onu_stat_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_onu_stat_cfg stat_cfg; /**< declare main API struct */
    bcmolt_xgpon_onu_key key = { };     /**< declare key */
    bcmolt_xgpon_onu_stat_id stat_id;   /**< declare stat ID */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_onu_stat_cfg stat_cfg;\n");
    bcmcli_log("bcmolt_xgpon_onu_key key = {  };\n");
    apicli_print_start(session, "bcmolt_stat_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ONU_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "onu_id");
    if (cli_parm != NULL)
    {
        key.onu_id = (bcmolt_xgpon_onu_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "onu_id is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.onu_id = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_ONU_KEY_ID_ONU_ID, &key.onu_id);
    bcmcli_log(";\n");

    /* set stat ID from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "sub");
    if (cli_parm != NULL)
    {
        stat_id = (bcmolt_xgpon_onu_stat_id) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
        return BCM_ERR_PARM;
    }

    /* init the API struct */
    switch (stat_id)
    {
        case BCMOLT_XGPON_ONU_STAT_ID_POSITIVE_DRIFT:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, positive_drift, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, positive_drift, key);\n");
            break;
        case BCMOLT_XGPON_ONU_STAT_ID_NEGATIVE_DRIFT:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, negative_drift, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, negative_drift, key);\n");
            break;
        case BCMOLT_XGPON_ONU_STAT_ID_DELIMITER_MISS_DETECTION:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, delimiter_miss_detection, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, delimiter_miss_detection, key);\n");
            break;
        case BCMOLT_XGPON_ONU_STAT_ID_BIP32_ERRORS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, bip32_errors, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, bip32_errors, key);\n");
            break;
        case BCMOLT_XGPON_ONU_STAT_ID_RX_WORDS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, rx_words, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, rx_words, key);\n");
            break;
        case BCMOLT_XGPON_ONU_STAT_ID_FEC_CORRECTED_SYMBOLS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, fec_corrected_symbols, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, fec_corrected_symbols, key);\n");
            break;
        case BCMOLT_XGPON_ONU_STAT_ID_FEC_CORRECTED_CODEWORDS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, fec_corrected_codewords, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, fec_corrected_codewords, key);\n");
            break;
        case BCMOLT_XGPON_ONU_STAT_ID_FEC_UNCORRECTABLE_CODEWORDS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, fec_uncorrectable_codewords, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, fec_uncorrectable_codewords, key);\n");
            break;
        case BCMOLT_XGPON_ONU_STAT_ID_FEC_CODEWORDS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, fec_codewords, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, fec_codewords, key);\n");
            break;
        case BCMOLT_XGPON_ONU_STAT_ID_FEC_CORRECTED_BITS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, fec_corrected_bits, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, fec_corrected_bits, key);\n");
            break;
        case BCMOLT_XGPON_ONU_STAT_ID_XGEM_KEY_ERRORS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, xgem_key_errors, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, xgem_key_errors, key);\n");
            break;
        case BCMOLT_XGPON_ONU_STAT_ID_XGEM_LOSS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, xgem_loss, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, xgem_loss, key);\n");
            break;
        case BCMOLT_XGPON_ONU_STAT_ID_RX_PLOAMS_MIC_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, rx_ploams_mic_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, rx_ploams_mic_error, key);\n");
            break;
        case BCMOLT_XGPON_ONU_STAT_ID_RX_PLOAMS_NON_IDLE:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, rx_ploams_non_idle, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, rx_ploams_non_idle, key);\n");
            break;
        case BCMOLT_XGPON_ONU_STAT_ID_RX_OMCI:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, rx_omci, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, rx_omci, key);\n");
            break;
        case BCMOLT_XGPON_ONU_STAT_ID_RX_OMCI_PACKETS_CRC_ERROR:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, rx_omci_packets_crc_error, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, rx_omci_packets_crc_error, key);\n");
            break;
        case BCMOLT_XGPON_ONU_STAT_ID_RX_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, rx_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, rx_bytes, key);\n");
            break;
        case BCMOLT_XGPON_ONU_STAT_ID_RX_PACKETS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, rx_packets, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, rx_packets, key);\n");
            break;
        case BCMOLT_XGPON_ONU_STAT_ID_TX_BYTES:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, tx_bytes, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, tx_bytes, key);\n");
            break;
        case BCMOLT_XGPON_ONU_STAT_ID_TX_PACKETS:
            BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, tx_packets, key);
            bcmcli_log("BCMOLT_STAT_CFG_INIT(&stat_cfg, xgpon_onu, tx_packets, key);\n");
            break;
        default:
            apicli_print_complete(session, BCM_ERR_RANGE, "\n");
            return BCM_ERR_RANGE;
    }

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.");
    if (cli_parm != NULL)
    {
        bcmolt_stat_alarm_config val = { };
        cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.trigger.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.type");
            if (cli_parm != NULL)
            {
                val.trigger.type = (bcmolt_stat_condition_type) cli_parm->value.enum_val;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.type is not set\n");
                return BCM_ERR_PARM;
            }

            switch (val.trigger.type)
            {
                case BCMOLT_STAT_CONDITION_TYPE_RATE_THRESHOLD:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.rising");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_threshold.rising = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.rising is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.falling");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_threshold.falling = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.falling is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_RATE_RANGE:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.upper");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_range.upper = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.upper is not set\n");
                        return BCM_ERR_PARM;
                    }

                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.lower");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.rate_range.lower = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.lower is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_VALUE_THRESHOLD:
                    cli_parm = bcmcli_find_named_parm(session, "cfg.trigger.limit");
                    if (cli_parm != NULL)
                    {
                        val.trigger.u.value_threshold.limit = cli_parm->value.unumber64;
                    }
                    else
                    {
                        apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger.limit is not set\n");
                        return BCM_ERR_PARM;
                    }
                    break;
                case BCMOLT_STAT_CONDITION_TYPE_NONE:
                    break;
                default:
                    apicli_print_complete(session, BCM_ERR_RANGE, "\n");
                    return BCM_ERR_RANGE;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cfg.trigger is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_parm_by_prefix(session, "cfg.soak.");
        if (cli_parm != NULL)
        {
            cli_parm = bcmcli_find_named_parm(session, "cfg.soak.active_soak_time");
            if (cli_parm != NULL)
            {
                val.soak.active_soak_time = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak.active_soak_time is not set\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "cfg.soak.clear_soak_time");
            if (cli_parm != NULL)
            {
                val.soak.clear_soak_time = cli_parm->value.unumber;
            }
            else
            {
                apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak.clear_soak_time is not set\n");
                return BCM_ERR_PARM;
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "cfg.soak is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_STAT_CFG_PROP_SET(&stat_cfg, xgpon_onu, cfg, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_stat_alarm_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_STAT_CFG, 0, BCMOLT_XGPON_ONU_STAT_CFG_ID_CFG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_STAT_CFG_PROP_SET(&stat_cfg, xgpon_onu, cfg, val);\n");
        bcmcli_log("}\n");
    }

    /* call API */
    err = bcmolt_stat_cfg_set(device_id, &stat_cfg.hdr);
    bcmcli_log("bcmolt_stat_cfg_set(device_id, &stat_cfg.hdr);\n");
    apicli_print_complete(session, err, stat_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_onu_auto_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_onu_auto_cfg auto_cfg; /**< declare main API struct */
    bcmolt_xgpon_onu_key key = { };     /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_onu_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_xgpon_onu_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_get");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, xgpon_onu, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, xgpon_onu, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "dfi");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, dfi);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, dfi);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "dgi");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, dgi);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, dgi);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "dowi");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, dowi);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, dowi);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "invalid_dbru_report");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, invalid_dbru_report);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, invalid_dbru_report);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "key_exchange_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, key_exchange_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, key_exchange_completed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "key_exchange_cycle_skipped");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, key_exchange_cycle_skipped);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, key_exchange_cycle_skipped);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "key_exchange_key_mismatch");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, key_exchange_key_mismatch);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, key_exchange_key_mismatch);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "key_exchange_key_request_timeout");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, key_exchange_key_request_timeout);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, key_exchange_key_request_timeout);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "looci");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, looci);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, looci);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_activation_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, onu_activation_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, onu_activation_completed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_alarm");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, onu_alarm);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, onu_alarm);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_deactivation_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, onu_deactivation_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, onu_deactivation_completed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_disable_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, onu_disable_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, onu_disable_completed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_enable_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, onu_enable_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, onu_enable_completed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_tuning_in_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, onu_tuning_in_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, onu_tuning_in_completed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_tuning_out_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, onu_tuning_out_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, onu_tuning_out_completed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "optical_reflection");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, optical_reflection);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, optical_reflection);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "possible_drift");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, possible_drift);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, possible_drift);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "power_consumption_report");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, power_consumption_report);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, power_consumption_report);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "power_level_report");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, power_level_report);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, power_level_report);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "power_management_state_change");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, power_management_state_change);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, power_management_state_change);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "pqsi");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, pqsi);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, pqsi);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "ranging_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, ranging_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, ranging_completed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "registration_id");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, registration_id);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, registration_id);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rssi_measurement_completed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, rssi_measurement_completed);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, rssi_measurement_completed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "sdi");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, sdi);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, sdi);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "secure_mutual_authentication_failure");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, secure_mutual_authentication_failure);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, secure_mutual_authentication_failure);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "sfi");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, sfi);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, sfi);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_cleared");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, stat_alarm_cleared);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, stat_alarm_cleared);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_raised");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, stat_alarm_raised);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, stat_alarm_raised);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "sufi");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, sufi);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, sufi);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tiwi");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, tiwi);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, tiwi);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tuning_response");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, tuning_response);
            bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, tuning_response);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_onu, dfi) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_onu, dgi) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_onu, dowi) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_onu, invalid_dbru_report) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_onu, key_exchange_completed) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_onu, key_exchange_cycle_skipped) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_onu, key_exchange_key_mismatch) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_onu, key_exchange_key_request_timeout) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_onu, looci) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_onu, onu_activation_completed) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_onu, onu_alarm) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_onu, onu_deactivation_completed) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_onu, onu_disable_completed) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_onu, onu_enable_completed) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_onu, onu_tuning_in_completed) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_onu, onu_tuning_out_completed) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_onu, optical_reflection) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_onu, possible_drift) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_onu, power_consumption_report) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_onu, power_level_report) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_onu, power_management_state_change) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_onu, pqsi) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_onu, ranging_completed) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_onu, registration_id) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_onu, rssi_measurement_completed) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_onu, sdi) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_onu, secure_mutual_authentication_failure) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_onu, sfi) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_onu, stat_alarm_cleared) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_onu, stat_alarm_raised) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_onu, sufi) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_onu, tiwi) && !BCMOLT_AUTO_CFG_PROP_IS_SET(&auto_cfg, xgpon_onu, tuning_response))
    {
        BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, all_properties);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_GET(&auto_cfg, xgpon_onu, all_properties);\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_get(device_id, &auto_cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &auto_cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_onu_auto_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_onu_auto_cfg auto_cfg; /**< declare main API struct */
    bcmolt_xgpon_onu_key key = { };     /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_onu_auto_cfg auto_cfg;\n");
    bcmcli_log("bcmolt_xgpon_onu_key key = {  };\n");
    apicli_print_start(session, "bcmolt_auto_cfg_set");

    /* init the API struct */
    BCMOLT_AUTO_CFG_INIT(&auto_cfg, xgpon_onu, key);
    bcmcli_log("BCMOLT_AUTO_CFG_INIT(&auto_cfg, xgpon_onu, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "dfi");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, dfi, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, dfi, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_ONU_AUTO_CFG_ID_DFI, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "dgi");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, dgi, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, dgi, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_ONU_AUTO_CFG_ID_DGI, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "dowi");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, dowi, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, dowi, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_ONU_AUTO_CFG_ID_DOWI, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "invalid_dbru_report");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, invalid_dbru_report, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, invalid_dbru_report, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_ONU_AUTO_CFG_ID_INVALID_DBRU_REPORT, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "key_exchange_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, key_exchange_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, key_exchange_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "key_exchange_cycle_skipped");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, key_exchange_cycle_skipped, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, key_exchange_cycle_skipped, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_CYCLE_SKIPPED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "key_exchange_key_mismatch");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, key_exchange_key_mismatch, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, key_exchange_key_mismatch, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_KEY_MISMATCH, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "key_exchange_key_request_timeout");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, key_exchange_key_request_timeout, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, key_exchange_key_request_timeout, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_KEY_REQUEST_TIMEOUT, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "looci");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, looci, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, looci, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_ONU_AUTO_CFG_ID_LOOCI, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_activation_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, onu_activation_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, onu_activation_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_ACTIVATION_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_alarm");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, onu_alarm, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, onu_alarm, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_ALARM, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_deactivation_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, onu_deactivation_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, onu_deactivation_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_DEACTIVATION_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_disable_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, onu_disable_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, onu_disable_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_DISABLE_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_enable_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, onu_enable_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, onu_enable_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_ENABLE_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_tuning_in_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, onu_tuning_in_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, onu_tuning_in_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_TUNING_IN_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "onu_tuning_out_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, onu_tuning_out_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, onu_tuning_out_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_TUNING_OUT_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "optical_reflection");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, optical_reflection, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, optical_reflection, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_ONU_AUTO_CFG_ID_OPTICAL_REFLECTION, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "possible_drift");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, possible_drift, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, possible_drift, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_ONU_AUTO_CFG_ID_POSSIBLE_DRIFT, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "power_consumption_report");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, power_consumption_report, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, power_consumption_report, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_ONU_AUTO_CFG_ID_POWER_CONSUMPTION_REPORT, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "power_level_report");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, power_level_report, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, power_level_report, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_ONU_AUTO_CFG_ID_POWER_LEVEL_REPORT, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "power_management_state_change");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, power_management_state_change, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, power_management_state_change, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_ONU_AUTO_CFG_ID_POWER_MANAGEMENT_STATE_CHANGE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "pqsi");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, pqsi, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, pqsi, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_ONU_AUTO_CFG_ID_PQSI, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "ranging_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, ranging_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, ranging_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_ONU_AUTO_CFG_ID_RANGING_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "registration_id");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, registration_id, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, registration_id, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_ONU_AUTO_CFG_ID_REGISTRATION_ID, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rssi_measurement_completed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, rssi_measurement_completed, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, rssi_measurement_completed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_ONU_AUTO_CFG_ID_RSSI_MEASUREMENT_COMPLETED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "sdi");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, sdi, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, sdi, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_ONU_AUTO_CFG_ID_SDI, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "secure_mutual_authentication_failure");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, secure_mutual_authentication_failure, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, secure_mutual_authentication_failure, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_ONU_AUTO_CFG_ID_SECURE_MUTUAL_AUTHENTICATION_FAILURE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "sfi");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, sfi, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, sfi, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_ONU_AUTO_CFG_ID_SFI, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_cleared");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, stat_alarm_cleared, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, stat_alarm_cleared, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_ONU_AUTO_CFG_ID_STAT_ALARM_CLEARED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "stat_alarm_raised");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, stat_alarm_raised, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, stat_alarm_raised, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_ONU_AUTO_CFG_ID_STAT_ALARM_RAISED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "sufi");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, sufi, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, sufi, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_ONU_AUTO_CFG_ID_SUFI, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "tiwi");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, tiwi, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, tiwi, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_ONU_AUTO_CFG_ID_TIWI, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "tuning_response");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, tuning_response, val);
        bcmcli_log("BCMOLT_AUTO_CFG_PROP_SET(&auto_cfg, xgpon_onu, tuning_response, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, BCMOLT_XGPON_ONU_AUTO_CFG_ID_TUNING_RESPONSE, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);
    bcmcli_log("bcmolt_auto_cfg_set(device_id, &auto_cfg.hdr);\n");
    apicli_print_complete(session, err, auto_cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_trx_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_trx_cfg cfg;       /**< declare main API struct */
    bcmolt_xgpon_trx_key key = { }; /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_trx_cfg cfg;\n");
    bcmcli_log("bcmolt_xgpon_trx_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_TRX, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_TRX_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, xgpon_trx, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, xgpon_trx, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "burst_profile");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_trx, burst_profile);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_trx, burst_profile);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "transceiver_config");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_trx, transceiver_config);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_trx, transceiver_config);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "transceiver_type");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_trx, transceiver_type);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_trx, transceiver_type);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "debug");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_trx, debug);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_trx, debug);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rssi_normal_config");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_trx, rssi_normal_config);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_trx, rssi_normal_config);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rssi_ranging_config");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_trx, rssi_ranging_config);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_trx, rssi_ranging_config);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "serdes_configuration");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_trx, serdes_configuration);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_trx, serdes_configuration);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "burst_profile_delimiter_max_errors");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_trx, burst_profile_delimiter_max_errors);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_trx, burst_profile_delimiter_max_errors);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "ranging_sm_patterns_at_init");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_trx, ranging_sm_patterns_at_init);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_trx, ranging_sm_patterns_at_init);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "ranging_sm_patterns_ed_failure");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_trx, ranging_sm_patterns_ed_failure);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_trx, ranging_sm_patterns_ed_failure);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "reset_on_del_miss");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_trx, reset_on_del_miss);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_trx, reset_on_del_miss);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "ed_state");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_trx, ed_state);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_trx, ed_state);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "invert_ed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_trx, invert_ed);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_trx, invert_ed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "end_of_burst_reset");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_trx, end_of_burst_reset);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_trx, end_of_burst_reset);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "trx_rst_polarity");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xgpon_trx, trx_rst_polarity);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_trx, trx_rst_polarity);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_trx, burst_profile) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_trx, transceiver_config) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_trx, transceiver_type) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_trx, debug) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_trx, rssi_normal_config) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_trx, rssi_ranging_config) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_trx, serdes_configuration) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_trx, burst_profile_delimiter_max_errors) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_trx, ranging_sm_patterns_at_init) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_trx, ranging_sm_patterns_ed_failure) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_trx, reset_on_del_miss) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_trx, ed_state) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_trx, invert_ed) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_trx, end_of_burst_reset) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xgpon_trx, trx_rst_polarity))
    {
        BCMOLT_CFG_PROP_GET(&cfg, xgpon_trx, all_properties);
        bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xgpon_trx, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_get(device_id, &cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_trx_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_trx_cfg cfg;       /**< declare main API struct */
    bcmolt_xgpon_trx_key key = { }; /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_trx_cfg cfg;\n");
    bcmcli_log("bcmolt_xgpon_trx_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_TRX, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_TRX_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, xgpon_trx, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, xgpon_trx, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_parm_by_prefix(session, "burst_profile.");
    if (cli_parm != NULL)
    {
        bcmolt_arr_xgpon_burst_profile_4 val = { };
        cli_parm = bcmcli_find_parm_by_prefix(session, "burst_profile.arr.");
        if (cli_parm != NULL)
        {
            int32_t i0;
            if (cli_parm->array_size != 4)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "array burst_profile.arr must have 4 elements\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "burst_profile.arr.profile_version");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "burst_profile.arr.profile_version is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 4; i0++)
                {
                    val.arr[i0].profile_version = cli_parm->values[i0].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "burst_profile.arr.is_fec_on");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "burst_profile.arr.is_fec_on is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 4; i0++)
                {
                    val.arr[i0].is_fec_on = cli_parm->values[i0].number;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "burst_profile.arr.delimiter_size_in_bytes");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "burst_profile.arr.delimiter_size_in_bytes is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 4; i0++)
                {
                    val.arr[i0].delimiter_size_in_bytes = cli_parm->values[i0].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "burst_profile.arr.delimiter_pattern_high");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "burst_profile.arr.delimiter_pattern_high is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 4; i0++)
                {
                    val.arr[i0].delimiter_pattern_high = cli_parm->values[i0].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "burst_profile.arr.delimiter_pattern_low");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "burst_profile.arr.delimiter_pattern_low is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 4; i0++)
                {
                    val.arr[i0].delimiter_pattern_low = cli_parm->values[i0].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "burst_profile.arr.preamble_length_in_bytes");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "burst_profile.arr.preamble_length_in_bytes is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 4; i0++)
                {
                    val.arr[i0].preamble_length_in_bytes = cli_parm->values[i0].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "burst_profile.arr.preamble_repeats_count");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "burst_profile.arr.preamble_repeats_count is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 4; i0++)
                {
                    val.arr[i0].preamble_repeats_count = cli_parm->values[i0].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "burst_profile.arr.preamble_pattern_high");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "burst_profile.arr.preamble_pattern_high is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 4; i0++)
                {
                    val.arr[i0].preamble_pattern_high = cli_parm->values[i0].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "burst_profile.arr.preamble_pattern_low");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "burst_profile.arr.preamble_pattern_low is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 4; i0++)
                {
                    val.arr[i0].preamble_pattern_low = cli_parm->values[i0].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "burst_profile.arr.pon_tag");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "burst_profile.arr.pon_tag is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 4; i0++)
                {
                    val.arr[i0].pon_tag = cli_parm->values[i0].unumber64;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "burst_profile.arr.num_of_guard_bytes");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "burst_profile.arr.num_of_guard_bytes is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 4; i0++)
                {
                    val.arr[i0].num_of_guard_bytes = cli_parm->values[i0].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "burst_profile.arr.is_profile_valid");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "burst_profile.arr.is_profile_valid is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 4; i0++)
                {
                    val.arr[i0].is_profile_valid = cli_parm->values[i0].number;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "burst_profile.arr.burst_overhead_size_in_words");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "burst_profile.arr.burst_overhead_size_in_words is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 4; i0++)
                {
                    val.arr[i0].burst_overhead_size_in_words = cli_parm->values[i0].unumber;
                }
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "burst_profile.arr is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, burst_profile, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_arr_xgpon_burst_profile_4 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_TRX_CFG_ID_BURST_PROFILE, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, burst_profile, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "transceiver_config.");
    if (cli_parm != NULL)
    {
        bcmolt_arr_xgpon_trx_configuration_4 val = { };
        cli_parm = bcmcli_find_parm_by_prefix(session, "transceiver_config.arr.");
        if (cli_parm != NULL)
        {
            int32_t i1;
            if (cli_parm->array_size != 4)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "array transceiver_config.arr must have 4 elements\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "transceiver_config.arr.trx_reset_pattern_first");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "transceiver_config.arr.trx_reset_pattern_first is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i1 = 0; i1 < 4; i1++)
                {
                    val.arr[i1].trx_reset_pattern_first = cli_parm->values[i1].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "transceiver_config.arr.trx_reset_pattern_middle");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "transceiver_config.arr.trx_reset_pattern_middle is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i1 = 0; i1 < 4; i1++)
                {
                    val.arr[i1].trx_reset_pattern_middle = cli_parm->values[i1].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "transceiver_config.arr.trx_reset_pattern_last");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "transceiver_config.arr.trx_reset_pattern_last is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i1 = 0; i1 < 4; i1++)
                {
                    val.arr[i1].trx_reset_pattern_last = cli_parm->values[i1].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "transceiver_config.arr.trx_reset_middle_repeats_count");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "transceiver_config.arr.trx_reset_middle_repeats_count is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i1 = 0; i1 < 4; i1++)
                {
                    val.arr[i1].trx_reset_middle_repeats_count = cli_parm->values[i1].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "transceiver_config.arr.trx_reset_location");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "transceiver_config.arr.trx_reset_location is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i1 = 0; i1 < 4; i1++)
                {
                    val.arr[i1].trx_reset_location = cli_parm->values[i1].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "transceiver_config.arr.trx_reset_polarity");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "transceiver_config.arr.trx_reset_polarity is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i1 = 0; i1 < 4; i1++)
                {
                    val.arr[i1].trx_reset_polarity = cli_parm->values[i1].number;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "transceiver_config.arr.bcdr_reset_pattern_first");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "transceiver_config.arr.bcdr_reset_pattern_first is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i1 = 0; i1 < 4; i1++)
                {
                    val.arr[i1].bcdr_reset_pattern_first = cli_parm->values[i1].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "transceiver_config.arr.bcdr_reset_pattern_middle");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "transceiver_config.arr.bcdr_reset_pattern_middle is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i1 = 0; i1 < 4; i1++)
                {
                    val.arr[i1].bcdr_reset_pattern_middle = cli_parm->values[i1].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "transceiver_config.arr.bcdr_reset_pattern_last");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "transceiver_config.arr.bcdr_reset_pattern_last is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i1 = 0; i1 < 4; i1++)
                {
                    val.arr[i1].bcdr_reset_pattern_last = cli_parm->values[i1].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "transceiver_config.arr.bcdr_reset_middle_repeats_count");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "transceiver_config.arr.bcdr_reset_middle_repeats_count is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i1 = 0; i1 < 4; i1++)
                {
                    val.arr[i1].bcdr_reset_middle_repeats_count = cli_parm->values[i1].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "transceiver_config.arr.bcdr_reset_location");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "transceiver_config.arr.bcdr_reset_location is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i1 = 0; i1 < 4; i1++)
                {
                    val.arr[i1].bcdr_reset_location = cli_parm->values[i1].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "transceiver_config.arr.bcdr_reset_polarity");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "transceiver_config.arr.bcdr_reset_polarity is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i1 = 0; i1 < 4; i1++)
                {
                    val.arr[i1].bcdr_reset_polarity = cli_parm->values[i1].number;
                }
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "transceiver_config.arr is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, transceiver_config, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_arr_xgpon_trx_configuration_4 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_TRX_CFG_ID_TRANSCEIVER_CONFIG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, transceiver_config, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "transceiver_type");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_trx_type val;
        val = (bcmolt_xgpon_trx_type) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, transceiver_type, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, transceiver_type, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_TRX_CFG_ID_TRANSCEIVER_TYPE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "debug.");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_trx_debug val = { };
        cli_parm = bcmcli_find_named_parm(session, "debug.rx_reversed_polarity");
        if (cli_parm != NULL)
        {
            val.rx_reversed_polarity = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "debug.rx_reversed_polarity is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "debug.neg_out_bit");
        if (cli_parm != NULL)
        {
            val.neg_out_bit = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "debug.neg_out_bit is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, debug, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_xgpon_trx_debug val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_TRX_CFG_ID_DEBUG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, debug, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "rssi_normal_config.");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_rssi_normal_config val = { };
        cli_parm = bcmcli_find_named_parm(session, "rssi_normal_config.polarity");
        if (cli_parm != NULL)
        {
            val.polarity = (bcmolt_polarity) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "rssi_normal_config.polarity is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "rssi_normal_config.location");
        if (cli_parm != NULL)
        {
            val.location = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "rssi_normal_config.location is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "rssi_normal_config.location_sign");
        if (cli_parm != NULL)
        {
            val.location_sign = (bcmolt_sign) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "rssi_normal_config.location_sign is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "rssi_normal_config.pulse_width");
        if (cli_parm != NULL)
        {
            val.pulse_width = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "rssi_normal_config.pulse_width is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "rssi_normal_config.minimum_burst");
        if (cli_parm != NULL)
        {
            val.minimum_burst = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "rssi_normal_config.minimum_burst is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, rssi_normal_config, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_xgpon_rssi_normal_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_TRX_CFG_ID_RSSI_NORMAL_CONFIG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, rssi_normal_config, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "rssi_ranging_config.");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_rssi_ranging_config val = { };
        cli_parm = bcmcli_find_named_parm(session, "rssi_ranging_config.start_on_ed");
        if (cli_parm != NULL)
        {
            val.start_on_ed = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "rssi_ranging_config.start_on_ed is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "rssi_ranging_config.frame_delay");
        if (cli_parm != NULL)
        {
            val.frame_delay = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "rssi_ranging_config.frame_delay is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "rssi_ranging_config.word_delay");
        if (cli_parm != NULL)
        {
            val.word_delay = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "rssi_ranging_config.word_delay is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "rssi_ranging_config.frame_delay_after_ed");
        if (cli_parm != NULL)
        {
            val.frame_delay_after_ed = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "rssi_ranging_config.frame_delay_after_ed is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "rssi_ranging_config.word_delay_after_ed");
        if (cli_parm != NULL)
        {
            val.word_delay_after_ed = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "rssi_ranging_config.word_delay_after_ed is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, rssi_ranging_config, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_xgpon_rssi_ranging_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_TRX_CFG_ID_RSSI_RANGING_CONFIG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, rssi_ranging_config, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "serdes_configuration.");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_serdes_configuration val = { };
        cli_parm = bcmcli_find_named_parm(session, "serdes_configuration.multi_ed_mode");
        if (cli_parm != NULL)
        {
            val.multi_ed_mode = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "serdes_configuration.multi_ed_mode is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "serdes_configuration.ranging_mode");
        if (cli_parm != NULL)
        {
            val.ranging_mode = (bcmolt_xgpon_serdes_ranging_mode) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "serdes_configuration.ranging_mode is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, serdes_configuration, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_xgpon_serdes_configuration val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_TRX_CFG_ID_SERDES_CONFIGURATION, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, serdes_configuration, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "burst_profile_delimiter_max_errors.");
    if (cli_parm != NULL)
    {
        bcmolt_arr_u8_4 val = { };
        cli_parm = bcmcli_find_named_parm(session, "burst_profile_delimiter_max_errors.arr");
        if (cli_parm != NULL)
        {
            if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 4)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "buffer burst_profile_delimiter_max_errors.arr must have 4 bytes\n");
                return BCM_ERR_PARM;
            }

            bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
            bcmolt_buf_read(&cli_parm->value.buffer, val.arr, 4);
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "burst_profile_delimiter_max_errors.arr is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, burst_profile_delimiter_max_errors, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_arr_u8_4 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_TRX_CFG_ID_BURST_PROFILE_DELIMITER_MAX_ERRORS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, burst_profile_delimiter_max_errors, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "ranging_sm_patterns_at_init.");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_rx_ranging_sm_pattern val = { };
        cli_parm = bcmcli_find_named_parm(session, "ranging_sm_patterns_at_init.trx_reset_pattern_first");
        if (cli_parm != NULL)
        {
            val.trx_reset_pattern_first = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ranging_sm_patterns_at_init.trx_reset_pattern_first is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "ranging_sm_patterns_at_init.trx_reset_pattern_middle");
        if (cli_parm != NULL)
        {
            val.trx_reset_pattern_middle = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ranging_sm_patterns_at_init.trx_reset_pattern_middle is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "ranging_sm_patterns_at_init.trx_reset_pattern_last");
        if (cli_parm != NULL)
        {
            val.trx_reset_pattern_last = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ranging_sm_patterns_at_init.trx_reset_pattern_last is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "ranging_sm_patterns_at_init.trx_reset_middle_repeats");
        if (cli_parm != NULL)
        {
            val.trx_reset_middle_repeats = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ranging_sm_patterns_at_init.trx_reset_middle_repeats is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "ranging_sm_patterns_at_init.trx_reset_location");
        if (cli_parm != NULL)
        {
            val.trx_reset_location = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ranging_sm_patterns_at_init.trx_reset_location is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "ranging_sm_patterns_at_init.bcdr_reset_pattern_first");
        if (cli_parm != NULL)
        {
            val.bcdr_reset_pattern_first = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ranging_sm_patterns_at_init.bcdr_reset_pattern_first is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "ranging_sm_patterns_at_init.bcdr_reset_pattern_middle");
        if (cli_parm != NULL)
        {
            val.bcdr_reset_pattern_middle = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ranging_sm_patterns_at_init.bcdr_reset_pattern_middle is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "ranging_sm_patterns_at_init.bcdr_reset_pattern_last");
        if (cli_parm != NULL)
        {
            val.bcdr_reset_pattern_last = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ranging_sm_patterns_at_init.bcdr_reset_pattern_last is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "ranging_sm_patterns_at_init.bcdr_reset_middle_repeats");
        if (cli_parm != NULL)
        {
            val.bcdr_reset_middle_repeats = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ranging_sm_patterns_at_init.bcdr_reset_middle_repeats is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "ranging_sm_patterns_at_init.bcdr_reset_location");
        if (cli_parm != NULL)
        {
            val.bcdr_reset_location = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ranging_sm_patterns_at_init.bcdr_reset_location is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "ranging_sm_patterns_at_init.bcdr_reset_polarity");
        if (cli_parm != NULL)
        {
            val.bcdr_reset_polarity = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ranging_sm_patterns_at_init.bcdr_reset_polarity is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, ranging_sm_patterns_at_init, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_xgpon_rx_ranging_sm_pattern val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_TRX_CFG_ID_RANGING_SM_PATTERNS_AT_INIT, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, ranging_sm_patterns_at_init, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "ranging_sm_patterns_ed_failure.");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_rx_ranging_sm_pattern val = { };
        cli_parm = bcmcli_find_named_parm(session, "ranging_sm_patterns_ed_failure.trx_reset_pattern_first");
        if (cli_parm != NULL)
        {
            val.trx_reset_pattern_first = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ranging_sm_patterns_ed_failure.trx_reset_pattern_first is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "ranging_sm_patterns_ed_failure.trx_reset_pattern_middle");
        if (cli_parm != NULL)
        {
            val.trx_reset_pattern_middle = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ranging_sm_patterns_ed_failure.trx_reset_pattern_middle is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "ranging_sm_patterns_ed_failure.trx_reset_pattern_last");
        if (cli_parm != NULL)
        {
            val.trx_reset_pattern_last = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ranging_sm_patterns_ed_failure.trx_reset_pattern_last is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "ranging_sm_patterns_ed_failure.trx_reset_middle_repeats");
        if (cli_parm != NULL)
        {
            val.trx_reset_middle_repeats = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ranging_sm_patterns_ed_failure.trx_reset_middle_repeats is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "ranging_sm_patterns_ed_failure.trx_reset_location");
        if (cli_parm != NULL)
        {
            val.trx_reset_location = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ranging_sm_patterns_ed_failure.trx_reset_location is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "ranging_sm_patterns_ed_failure.bcdr_reset_pattern_first");
        if (cli_parm != NULL)
        {
            val.bcdr_reset_pattern_first = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ranging_sm_patterns_ed_failure.bcdr_reset_pattern_first is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "ranging_sm_patterns_ed_failure.bcdr_reset_pattern_middle");
        if (cli_parm != NULL)
        {
            val.bcdr_reset_pattern_middle = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ranging_sm_patterns_ed_failure.bcdr_reset_pattern_middle is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "ranging_sm_patterns_ed_failure.bcdr_reset_pattern_last");
        if (cli_parm != NULL)
        {
            val.bcdr_reset_pattern_last = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ranging_sm_patterns_ed_failure.bcdr_reset_pattern_last is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "ranging_sm_patterns_ed_failure.bcdr_reset_middle_repeats");
        if (cli_parm != NULL)
        {
            val.bcdr_reset_middle_repeats = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ranging_sm_patterns_ed_failure.bcdr_reset_middle_repeats is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "ranging_sm_patterns_ed_failure.bcdr_reset_location");
        if (cli_parm != NULL)
        {
            val.bcdr_reset_location = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ranging_sm_patterns_ed_failure.bcdr_reset_location is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "ranging_sm_patterns_ed_failure.bcdr_reset_polarity");
        if (cli_parm != NULL)
        {
            val.bcdr_reset_polarity = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ranging_sm_patterns_ed_failure.bcdr_reset_polarity is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, ranging_sm_patterns_ed_failure, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_xgpon_rx_ranging_sm_pattern val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_TRX_CFG_ID_RANGING_SM_PATTERNS_ED_FAILURE, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, ranging_sm_patterns_ed_failure, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "reset_on_del_miss");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, reset_on_del_miss, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, reset_on_del_miss, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_TRX_CFG_ID_RESET_ON_DEL_MISS, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "ed_state.");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_ed_state val = { };
        cli_parm = bcmcli_find_named_parm(session, "ed_state.reset_on_ed_fail");
        if (cli_parm != NULL)
        {
            val.reset_on_ed_fail = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ed_state.reset_on_ed_fail is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "ed_state.reset_on_ed_success");
        if (cli_parm != NULL)
        {
            val.reset_on_ed_success = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "ed_state.reset_on_ed_success is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, ed_state, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_xgpon_ed_state val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_TRX_CFG_ID_ED_STATE, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, ed_state, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "invert_ed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, invert_ed, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, invert_ed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_TRX_CFG_ID_INVERT_ED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "end_of_burst_reset");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, end_of_burst_reset, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, end_of_burst_reset, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_TRX_CFG_ID_END_OF_BURST_RESET, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "trx_rst_polarity");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, trx_rst_polarity, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, trx_rst_polarity, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_TRX_CFG_ID_TRX_RST_POLARITY, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_cfg_set(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_set(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_trx_cfg_clear(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_trx_cfg cfg;       /**< declare main API struct */
    bcmolt_xgpon_trx_key key = { }; /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_trx_cfg cfg;\n");
    bcmcli_log("bcmolt_xgpon_trx_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_clear");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_TRX, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_TRX_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, xgpon_trx, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, xgpon_trx, key);\n");

    /* call API */
    err = bcmolt_cfg_clear(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_clear(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xgpon_trx_cfg_get_multi(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xgpon_trx_cfg cfg;       /**< declare main API struct */
    bcmolt_xgpon_trx_key key = { }; /**< declare key */
    bcmolt_msg_set *msg_set = NULL; /**< declare message set */
    uint32_t max_msgs;              /**< declare max number of msgs to get */
    bcmos_bool invert_filter;       /**< declare filter invert flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xgpon_trx_cfg cfg;\n");
    bcmcli_log("bcmolt_xgpon_trx_key key = {  };\n");
    bcmcli_log("bcmolt_msg_set* msg_set = NULL;\n");
    bcmcli_log("uint32_t max_msgs;\n");
    bcmcli_log("bcmos_bool invert_filter;\n");
    apicli_print_start(session, "bcmolt_cfg_get_multi");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_xgpon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_TRX, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XGPON_TRX_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");

    /* set max number of msgs from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "max_msgs");
    if (cli_parm != NULL)
    {
        max_msgs = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "max_msgs is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("max_msgs = %d;\n", max_msgs);

    /* set filter invert flag from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "filter_invert");
    if (cli_parm != NULL)
    {
        invert_filter = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "filter_invert is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("invert_filter = %s;\n", (invert_filter) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* allocate message set */
    err = apicli_msg_set_alloc(byte_pool, BCMOLT_OBJ_ID_XGPON_TRX, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);
    if (err != BCM_ERR_OK)
    {
        return err;
    }

    bcmcli_log("bcmolt_msg_set_alloc(BCMOLT_OBJ_ID_XGPON_TRX, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, xgpon_trx, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, xgpon_trx, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.burst_profile.");
    if (cli_parm != NULL)
    {
        bcmolt_arr_xgpon_burst_profile_4 val = { };
        cli_parm = bcmcli_find_parm_by_prefix(session, "filter.burst_profile.arr.");
        if (cli_parm != NULL)
        {
            int32_t i0;
            if (cli_parm->array_size != 4)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "array filter.burst_profile.arr must have 4 elements\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.burst_profile.arr.profile_version");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.burst_profile.arr.profile_version is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 4; i0++)
                {
                    val.arr[i0].profile_version = cli_parm->values[i0].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.burst_profile.arr.is_fec_on");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.burst_profile.arr.is_fec_on is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 4; i0++)
                {
                    val.arr[i0].is_fec_on = cli_parm->values[i0].number;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.burst_profile.arr.delimiter_size_in_bytes");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.burst_profile.arr.delimiter_size_in_bytes is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 4; i0++)
                {
                    val.arr[i0].delimiter_size_in_bytes = cli_parm->values[i0].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.burst_profile.arr.delimiter_pattern_high");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.burst_profile.arr.delimiter_pattern_high is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 4; i0++)
                {
                    val.arr[i0].delimiter_pattern_high = cli_parm->values[i0].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.burst_profile.arr.delimiter_pattern_low");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.burst_profile.arr.delimiter_pattern_low is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 4; i0++)
                {
                    val.arr[i0].delimiter_pattern_low = cli_parm->values[i0].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.burst_profile.arr.preamble_length_in_bytes");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.burst_profile.arr.preamble_length_in_bytes is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 4; i0++)
                {
                    val.arr[i0].preamble_length_in_bytes = cli_parm->values[i0].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.burst_profile.arr.preamble_repeats_count");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.burst_profile.arr.preamble_repeats_count is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 4; i0++)
                {
                    val.arr[i0].preamble_repeats_count = cli_parm->values[i0].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.burst_profile.arr.preamble_pattern_high");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.burst_profile.arr.preamble_pattern_high is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 4; i0++)
                {
                    val.arr[i0].preamble_pattern_high = cli_parm->values[i0].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.burst_profile.arr.preamble_pattern_low");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.burst_profile.arr.preamble_pattern_low is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 4; i0++)
                {
                    val.arr[i0].preamble_pattern_low = cli_parm->values[i0].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.burst_profile.arr.pon_tag");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.burst_profile.arr.pon_tag is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 4; i0++)
                {
                    val.arr[i0].pon_tag = cli_parm->values[i0].unumber64;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.burst_profile.arr.num_of_guard_bytes");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.burst_profile.arr.num_of_guard_bytes is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 4; i0++)
                {
                    val.arr[i0].num_of_guard_bytes = cli_parm->values[i0].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.burst_profile.arr.is_profile_valid");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.burst_profile.arr.is_profile_valid is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 4; i0++)
                {
                    val.arr[i0].is_profile_valid = cli_parm->values[i0].number;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.burst_profile.arr.burst_overhead_size_in_words");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.burst_profile.arr.burst_overhead_size_in_words is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i0 = 0; i0 < 4; i0++)
                {
                    val.arr[i0].burst_overhead_size_in_words = cli_parm->values[i0].unumber;
                }
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.burst_profile.arr is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, burst_profile, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_arr_xgpon_burst_profile_4 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_TRX_CFG_ID_BURST_PROFILE, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, burst_profile, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "burst_profile");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_trx, burst_profile);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_trx, burst_profile);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.transceiver_config.");
    if (cli_parm != NULL)
    {
        bcmolt_arr_xgpon_trx_configuration_4 val = { };
        cli_parm = bcmcli_find_parm_by_prefix(session, "filter.transceiver_config.arr.");
        if (cli_parm != NULL)
        {
            int32_t i1;
            if (cli_parm->array_size != 4)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "array filter.transceiver_config.arr must have 4 elements\n");
                return BCM_ERR_PARM;
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.transceiver_config.arr.trx_reset_pattern_first");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.transceiver_config.arr.trx_reset_pattern_first is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i1 = 0; i1 < 4; i1++)
                {
                    val.arr[i1].trx_reset_pattern_first = cli_parm->values[i1].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.transceiver_config.arr.trx_reset_pattern_middle");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.transceiver_config.arr.trx_reset_pattern_middle is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i1 = 0; i1 < 4; i1++)
                {
                    val.arr[i1].trx_reset_pattern_middle = cli_parm->values[i1].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.transceiver_config.arr.trx_reset_pattern_last");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.transceiver_config.arr.trx_reset_pattern_last is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i1 = 0; i1 < 4; i1++)
                {
                    val.arr[i1].trx_reset_pattern_last = cli_parm->values[i1].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.transceiver_config.arr.trx_reset_middle_repeats_count");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.transceiver_config.arr.trx_reset_middle_repeats_count is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i1 = 0; i1 < 4; i1++)
                {
                    val.arr[i1].trx_reset_middle_repeats_count = cli_parm->values[i1].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.transceiver_config.arr.trx_reset_location");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.transceiver_config.arr.trx_reset_location is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i1 = 0; i1 < 4; i1++)
                {
                    val.arr[i1].trx_reset_location = cli_parm->values[i1].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.transceiver_config.arr.trx_reset_polarity");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.transceiver_config.arr.trx_reset_polarity is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i1 = 0; i1 < 4; i1++)
                {
                    val.arr[i1].trx_reset_polarity = cli_parm->values[i1].number;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.transceiver_config.arr.bcdr_reset_pattern_first");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.transceiver_config.arr.bcdr_reset_pattern_first is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i1 = 0; i1 < 4; i1++)
                {
                    val.arr[i1].bcdr_reset_pattern_first = cli_parm->values[i1].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.transceiver_config.arr.bcdr_reset_pattern_middle");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.transceiver_config.arr.bcdr_reset_pattern_middle is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i1 = 0; i1 < 4; i1++)
                {
                    val.arr[i1].bcdr_reset_pattern_middle = cli_parm->values[i1].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.transceiver_config.arr.bcdr_reset_pattern_last");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.transceiver_config.arr.bcdr_reset_pattern_last is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i1 = 0; i1 < 4; i1++)
                {
                    val.arr[i1].bcdr_reset_pattern_last = cli_parm->values[i1].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.transceiver_config.arr.bcdr_reset_middle_repeats_count");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.transceiver_config.arr.bcdr_reset_middle_repeats_count is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i1 = 0; i1 < 4; i1++)
                {
                    val.arr[i1].bcdr_reset_middle_repeats_count = cli_parm->values[i1].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.transceiver_config.arr.bcdr_reset_location");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.transceiver_config.arr.bcdr_reset_location is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i1 = 0; i1 < 4; i1++)
                {
                    val.arr[i1].bcdr_reset_location = cli_parm->values[i1].unumber;
                }
            }

            cli_parm = bcmcli_find_named_parm(session, "filter.transceiver_config.arr.bcdr_reset_polarity");
            if (cli_parm != NULL)
            {
                if (cli_parm->array_size != 4)
                {
                    apicli_print_complete(session, BCM_ERR_PARM, "filter.transceiver_config.arr.bcdr_reset_polarity is a different size than other arrays in the struct\n");
                    return BCM_ERR_PARM;
                }

                for (i1 = 0; i1 < 4; i1++)
                {
                    val.arr[i1].bcdr_reset_polarity = cli_parm->values[i1].number;
                }
            }
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.transceiver_config.arr is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, transceiver_config, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_arr_xgpon_trx_configuration_4 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_TRX_CFG_ID_TRANSCEIVER_CONFIG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, transceiver_config, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "transceiver_config");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_trx, transceiver_config);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_trx, transceiver_config);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.transceiver_type");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_trx_type val;
        val = (bcmolt_xgpon_trx_type) cli_parm->value.enum_val;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, transceiver_type, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, transceiver_type, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_TRX_CFG_ID_TRANSCEIVER_TYPE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "transceiver_type");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_trx, transceiver_type);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_trx, transceiver_type);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.debug.");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_trx_debug val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.debug.rx_reversed_polarity");
        if (cli_parm != NULL)
        {
            val.rx_reversed_polarity = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.debug.rx_reversed_polarity is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.debug.neg_out_bit");
        if (cli_parm != NULL)
        {
            val.neg_out_bit = (bcmolt_control_state) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.debug.neg_out_bit is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, debug, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_xgpon_trx_debug val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_TRX_CFG_ID_DEBUG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, debug, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "debug");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_trx, debug);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_trx, debug);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.rssi_normal_config.");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_rssi_normal_config val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.rssi_normal_config.polarity");
        if (cli_parm != NULL)
        {
            val.polarity = (bcmolt_polarity) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.rssi_normal_config.polarity is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.rssi_normal_config.location");
        if (cli_parm != NULL)
        {
            val.location = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.rssi_normal_config.location is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.rssi_normal_config.location_sign");
        if (cli_parm != NULL)
        {
            val.location_sign = (bcmolt_sign) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.rssi_normal_config.location_sign is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.rssi_normal_config.pulse_width");
        if (cli_parm != NULL)
        {
            val.pulse_width = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.rssi_normal_config.pulse_width is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.rssi_normal_config.minimum_burst");
        if (cli_parm != NULL)
        {
            val.minimum_burst = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.rssi_normal_config.minimum_burst is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, rssi_normal_config, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_xgpon_rssi_normal_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_TRX_CFG_ID_RSSI_NORMAL_CONFIG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, rssi_normal_config, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rssi_normal_config");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_trx, rssi_normal_config);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_trx, rssi_normal_config);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.rssi_ranging_config.");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_rssi_ranging_config val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.rssi_ranging_config.start_on_ed");
        if (cli_parm != NULL)
        {
            val.start_on_ed = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.rssi_ranging_config.start_on_ed is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.rssi_ranging_config.frame_delay");
        if (cli_parm != NULL)
        {
            val.frame_delay = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.rssi_ranging_config.frame_delay is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.rssi_ranging_config.word_delay");
        if (cli_parm != NULL)
        {
            val.word_delay = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.rssi_ranging_config.word_delay is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.rssi_ranging_config.frame_delay_after_ed");
        if (cli_parm != NULL)
        {
            val.frame_delay_after_ed = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.rssi_ranging_config.frame_delay_after_ed is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.rssi_ranging_config.word_delay_after_ed");
        if (cli_parm != NULL)
        {
            val.word_delay_after_ed = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.rssi_ranging_config.word_delay_after_ed is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, rssi_ranging_config, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_xgpon_rssi_ranging_config val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_TRX_CFG_ID_RSSI_RANGING_CONFIG, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, rssi_ranging_config, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rssi_ranging_config");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_trx, rssi_ranging_config);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_trx, rssi_ranging_config);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.serdes_configuration.");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_serdes_configuration val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.serdes_configuration.multi_ed_mode");
        if (cli_parm != NULL)
        {
            val.multi_ed_mode = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.serdes_configuration.multi_ed_mode is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.serdes_configuration.ranging_mode");
        if (cli_parm != NULL)
        {
            val.ranging_mode = (bcmolt_xgpon_serdes_ranging_mode) cli_parm->value.enum_val;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.serdes_configuration.ranging_mode is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, serdes_configuration, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_xgpon_serdes_configuration val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_TRX_CFG_ID_SERDES_CONFIGURATION, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, serdes_configuration, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "serdes_configuration");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_trx, serdes_configuration);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_trx, serdes_configuration);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.burst_profile_delimiter_max_errors.");
    if (cli_parm != NULL)
    {
        bcmolt_arr_u8_4 val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.burst_profile_delimiter_max_errors.arr");
        if (cli_parm != NULL)
        {
            if (bcmolt_buf_get_used(&cli_parm->value.buffer) != 4)
            {
                apicli_print_complete(session, BCM_ERR_PARM, "buffer filter.burst_profile_delimiter_max_errors.arr must have 4 bytes\n");
                return BCM_ERR_PARM;
            }

            bcmolt_buf_set_pos(&cli_parm->value.buffer, 0);
            bcmolt_buf_read(&cli_parm->value.buffer, val.arr, 4);
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.burst_profile_delimiter_max_errors.arr is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, burst_profile_delimiter_max_errors, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_arr_u8_4 val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_TRX_CFG_ID_BURST_PROFILE_DELIMITER_MAX_ERRORS, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, burst_profile_delimiter_max_errors, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "burst_profile_delimiter_max_errors");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_trx, burst_profile_delimiter_max_errors);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_trx, burst_profile_delimiter_max_errors);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.ranging_sm_patterns_at_init.");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_rx_ranging_sm_pattern val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.ranging_sm_patterns_at_init.trx_reset_pattern_first");
        if (cli_parm != NULL)
        {
            val.trx_reset_pattern_first = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ranging_sm_patterns_at_init.trx_reset_pattern_first is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.ranging_sm_patterns_at_init.trx_reset_pattern_middle");
        if (cli_parm != NULL)
        {
            val.trx_reset_pattern_middle = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ranging_sm_patterns_at_init.trx_reset_pattern_middle is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.ranging_sm_patterns_at_init.trx_reset_pattern_last");
        if (cli_parm != NULL)
        {
            val.trx_reset_pattern_last = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ranging_sm_patterns_at_init.trx_reset_pattern_last is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.ranging_sm_patterns_at_init.trx_reset_middle_repeats");
        if (cli_parm != NULL)
        {
            val.trx_reset_middle_repeats = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ranging_sm_patterns_at_init.trx_reset_middle_repeats is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.ranging_sm_patterns_at_init.trx_reset_location");
        if (cli_parm != NULL)
        {
            val.trx_reset_location = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ranging_sm_patterns_at_init.trx_reset_location is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.ranging_sm_patterns_at_init.bcdr_reset_pattern_first");
        if (cli_parm != NULL)
        {
            val.bcdr_reset_pattern_first = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ranging_sm_patterns_at_init.bcdr_reset_pattern_first is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.ranging_sm_patterns_at_init.bcdr_reset_pattern_middle");
        if (cli_parm != NULL)
        {
            val.bcdr_reset_pattern_middle = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ranging_sm_patterns_at_init.bcdr_reset_pattern_middle is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.ranging_sm_patterns_at_init.bcdr_reset_pattern_last");
        if (cli_parm != NULL)
        {
            val.bcdr_reset_pattern_last = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ranging_sm_patterns_at_init.bcdr_reset_pattern_last is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.ranging_sm_patterns_at_init.bcdr_reset_middle_repeats");
        if (cli_parm != NULL)
        {
            val.bcdr_reset_middle_repeats = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ranging_sm_patterns_at_init.bcdr_reset_middle_repeats is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.ranging_sm_patterns_at_init.bcdr_reset_location");
        if (cli_parm != NULL)
        {
            val.bcdr_reset_location = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ranging_sm_patterns_at_init.bcdr_reset_location is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.ranging_sm_patterns_at_init.bcdr_reset_polarity");
        if (cli_parm != NULL)
        {
            val.bcdr_reset_polarity = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ranging_sm_patterns_at_init.bcdr_reset_polarity is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, ranging_sm_patterns_at_init, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_xgpon_rx_ranging_sm_pattern val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_TRX_CFG_ID_RANGING_SM_PATTERNS_AT_INIT, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, ranging_sm_patterns_at_init, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "ranging_sm_patterns_at_init");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_trx, ranging_sm_patterns_at_init);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_trx, ranging_sm_patterns_at_init);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.ranging_sm_patterns_ed_failure.");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_rx_ranging_sm_pattern val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.ranging_sm_patterns_ed_failure.trx_reset_pattern_first");
        if (cli_parm != NULL)
        {
            val.trx_reset_pattern_first = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ranging_sm_patterns_ed_failure.trx_reset_pattern_first is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.ranging_sm_patterns_ed_failure.trx_reset_pattern_middle");
        if (cli_parm != NULL)
        {
            val.trx_reset_pattern_middle = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ranging_sm_patterns_ed_failure.trx_reset_pattern_middle is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.ranging_sm_patterns_ed_failure.trx_reset_pattern_last");
        if (cli_parm != NULL)
        {
            val.trx_reset_pattern_last = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ranging_sm_patterns_ed_failure.trx_reset_pattern_last is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.ranging_sm_patterns_ed_failure.trx_reset_middle_repeats");
        if (cli_parm != NULL)
        {
            val.trx_reset_middle_repeats = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ranging_sm_patterns_ed_failure.trx_reset_middle_repeats is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.ranging_sm_patterns_ed_failure.trx_reset_location");
        if (cli_parm != NULL)
        {
            val.trx_reset_location = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ranging_sm_patterns_ed_failure.trx_reset_location is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.ranging_sm_patterns_ed_failure.bcdr_reset_pattern_first");
        if (cli_parm != NULL)
        {
            val.bcdr_reset_pattern_first = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ranging_sm_patterns_ed_failure.bcdr_reset_pattern_first is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.ranging_sm_patterns_ed_failure.bcdr_reset_pattern_middle");
        if (cli_parm != NULL)
        {
            val.bcdr_reset_pattern_middle = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ranging_sm_patterns_ed_failure.bcdr_reset_pattern_middle is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.ranging_sm_patterns_ed_failure.bcdr_reset_pattern_last");
        if (cli_parm != NULL)
        {
            val.bcdr_reset_pattern_last = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ranging_sm_patterns_ed_failure.bcdr_reset_pattern_last is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.ranging_sm_patterns_ed_failure.bcdr_reset_middle_repeats");
        if (cli_parm != NULL)
        {
            val.bcdr_reset_middle_repeats = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ranging_sm_patterns_ed_failure.bcdr_reset_middle_repeats is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.ranging_sm_patterns_ed_failure.bcdr_reset_location");
        if (cli_parm != NULL)
        {
            val.bcdr_reset_location = cli_parm->value.unumber;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ranging_sm_patterns_ed_failure.bcdr_reset_location is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.ranging_sm_patterns_ed_failure.bcdr_reset_polarity");
        if (cli_parm != NULL)
        {
            val.bcdr_reset_polarity = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ranging_sm_patterns_ed_failure.bcdr_reset_polarity is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, ranging_sm_patterns_ed_failure, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_xgpon_rx_ranging_sm_pattern val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_TRX_CFG_ID_RANGING_SM_PATTERNS_ED_FAILURE, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, ranging_sm_patterns_ed_failure, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "ranging_sm_patterns_ed_failure");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_trx, ranging_sm_patterns_ed_failure);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_trx, ranging_sm_patterns_ed_failure);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.reset_on_del_miss");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, reset_on_del_miss, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, reset_on_del_miss, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_TRX_CFG_ID_RESET_ON_DEL_MISS, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "reset_on_del_miss");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_trx, reset_on_del_miss);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_trx, reset_on_del_miss);\n");
        }
    }

    cli_parm = bcmcli_find_parm_by_prefix(session, "filter.ed_state.");
    if (cli_parm != NULL)
    {
        bcmolt_xgpon_ed_state val = { };
        cli_parm = bcmcli_find_named_parm(session, "filter.ed_state.reset_on_ed_fail");
        if (cli_parm != NULL)
        {
            val.reset_on_ed_fail = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ed_state.reset_on_ed_fail is not set\n");
            return BCM_ERR_PARM;
        }

        cli_parm = bcmcli_find_named_parm(session, "filter.ed_state.reset_on_ed_success");
        if (cli_parm != NULL)
        {
            val.reset_on_ed_success = cli_parm->value.number;
        }
        else
        {
            apicli_print_complete(session, BCM_ERR_PARM, "filter.ed_state.reset_on_ed_success is not set\n");
            return BCM_ERR_PARM;
        }

        BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, ed_state, val);
        bcmcli_log("{\n");
        bcmcli_log("bcmolt_xgpon_ed_state val = ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_TRX_CFG_ID_ED_STATE, &val);
        bcmcli_log(";\n");
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, ed_state, val);\n");
        bcmcli_log("}\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "ed_state");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_trx, ed_state);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_trx, ed_state);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.invert_ed");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, invert_ed, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, invert_ed, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_TRX_CFG_ID_INVERT_ED, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "invert_ed");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_trx, invert_ed);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_trx, invert_ed);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.end_of_burst_reset");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, end_of_burst_reset, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, end_of_burst_reset, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_TRX_CFG_ID_END_OF_BURST_RESET, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "end_of_burst_reset");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_trx, end_of_burst_reset);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_trx, end_of_burst_reset);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.trx_rst_polarity");
    if (cli_parm != NULL)
    {
        bcmos_bool val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, trx_rst_polarity, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xgpon_trx, trx_rst_polarity, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XGPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XGPON_TRX_CFG_ID_TRX_RST_POLARITY, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "trx_rst_polarity");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_trx, trx_rst_polarity);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_trx, trx_rst_polarity);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_trx, burst_profile) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_trx, transceiver_config) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_trx, transceiver_type) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_trx, debug) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_trx, rssi_normal_config) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_trx, rssi_ranging_config) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_trx, serdes_configuration) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_trx, burst_profile_delimiter_max_errors) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_trx, ranging_sm_patterns_at_init) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_trx, ranging_sm_patterns_ed_failure) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_trx, reset_on_del_miss) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_trx, ed_state) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_trx, invert_ed) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_trx, end_of_burst_reset) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xgpon_trx, trx_rst_polarity))
    {
        BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_trx, all_properties);
        bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xgpon_trx, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);
    bcmcli_log("bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xpon_serdes_cfg_get(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xpon_serdes_cfg cfg;         /**< declare main API struct */
    bcmolt_xpon_serdes_key key = { };   /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xpon_serdes_cfg cfg;\n");
    bcmcli_log("bcmolt_xpon_serdes_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_get");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_pon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XPON_SERDES, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XPON_SERDES_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "instance");
    if (cli_parm != NULL)
    {
        key.instance = (bcmolt_serdes_instance) cli_parm->value.enum_val;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "instance is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.instance = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XPON_SERDES, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XPON_SERDES_KEY_ID_INSTANCE, &key.instance);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, xpon_serdes, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, xpon_serdes, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "rx_vga");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xpon_serdes, rx_vga);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xpon_serdes, rx_vga);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_pf");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xpon_serdes, rx_pf);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xpon_serdes, rx_pf);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_lfpf");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xpon_serdes, rx_lfpf);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xpon_serdes, rx_lfpf);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_dfe1");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xpon_serdes, rx_dfe1);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xpon_serdes, rx_dfe1);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_dfe2");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xpon_serdes, rx_dfe2);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xpon_serdes, rx_dfe2);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_dfe3");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xpon_serdes, rx_dfe3);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xpon_serdes, rx_dfe3);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_dfe4");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xpon_serdes, rx_dfe4);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xpon_serdes, rx_dfe4);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_dfe5");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xpon_serdes, rx_dfe5);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xpon_serdes, rx_dfe5);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_pre");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xpon_serdes, tx_pre);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xpon_serdes, tx_pre);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_main");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xpon_serdes, tx_main);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xpon_serdes, tx_main);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_post1");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xpon_serdes, tx_post1);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xpon_serdes, tx_post1);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_post2");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xpon_serdes, tx_post2);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xpon_serdes, tx_post2);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_post3");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xpon_serdes, tx_post3);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xpon_serdes, tx_post3);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_amp");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_CFG_PROP_GET(&cfg, xpon_serdes, tx_amp);
            bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xpon_serdes, tx_amp);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_CFG_PROP_IS_SET(&cfg, xpon_serdes, rx_vga) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xpon_serdes, rx_pf) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xpon_serdes, rx_lfpf) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xpon_serdes, rx_dfe1) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xpon_serdes, rx_dfe2) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xpon_serdes, rx_dfe3) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xpon_serdes, rx_dfe4) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xpon_serdes, rx_dfe5) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xpon_serdes, tx_pre) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xpon_serdes, tx_main) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xpon_serdes, tx_post1) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xpon_serdes, tx_post2) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xpon_serdes, tx_post3) && !BCMOLT_CFG_PROP_IS_SET(&cfg, xpon_serdes, tx_amp))
    {
        BCMOLT_CFG_PROP_GET(&cfg, xpon_serdes, all_properties);
        bcmcli_log("BCMOLT_CFG_PROP_GET(&cfg, xpon_serdes, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_get(device_id, &cfg.hdr);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xpon_serdes_cfg_set(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xpon_serdes_cfg cfg;         /**< declare main API struct */
    bcmolt_xpon_serdes_key key = { };   /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xpon_serdes_cfg cfg;\n");
    bcmcli_log("bcmolt_xpon_serdes_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_set");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_pon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XPON_SERDES, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XPON_SERDES_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "instance");
    if (cli_parm != NULL)
    {
        key.instance = (bcmolt_serdes_instance) cli_parm->value.enum_val;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "instance is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.instance = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XPON_SERDES, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XPON_SERDES_KEY_ID_INSTANCE, &key.instance);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, xpon_serdes, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, xpon_serdes, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "rx_vga");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, rx_vga, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, rx_vga, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XPON_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XPON_SERDES_CFG_ID_RX_VGA, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_pf");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, rx_pf, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, rx_pf, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XPON_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XPON_SERDES_CFG_ID_RX_PF, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_lfpf");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, rx_lfpf, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, rx_lfpf, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XPON_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XPON_SERDES_CFG_ID_RX_LFPF, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_dfe1");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, rx_dfe1, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, rx_dfe1, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XPON_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XPON_SERDES_CFG_ID_RX_DFE1, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_dfe2");
    if (cli_parm != NULL)
    {
        int8_t val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, rx_dfe2, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, rx_dfe2, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XPON_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XPON_SERDES_CFG_ID_RX_DFE2, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_dfe3");
    if (cli_parm != NULL)
    {
        int8_t val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, rx_dfe3, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, rx_dfe3, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XPON_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XPON_SERDES_CFG_ID_RX_DFE3, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_dfe4");
    if (cli_parm != NULL)
    {
        int8_t val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, rx_dfe4, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, rx_dfe4, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XPON_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XPON_SERDES_CFG_ID_RX_DFE4, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_dfe5");
    if (cli_parm != NULL)
    {
        int8_t val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, rx_dfe5, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, rx_dfe5, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XPON_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XPON_SERDES_CFG_ID_RX_DFE5, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_pre");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, tx_pre, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, tx_pre, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XPON_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XPON_SERDES_CFG_ID_TX_PRE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_main");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, tx_main, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, tx_main, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XPON_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XPON_SERDES_CFG_ID_TX_MAIN, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_post1");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, tx_post1, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, tx_post1, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XPON_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XPON_SERDES_CFG_ID_TX_POST1, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_post2");
    if (cli_parm != NULL)
    {
        int8_t val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, tx_post2, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, tx_post2, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XPON_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XPON_SERDES_CFG_ID_TX_POST2, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_post3");
    if (cli_parm != NULL)
    {
        int8_t val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, tx_post3, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, tx_post3, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XPON_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XPON_SERDES_CFG_ID_TX_POST3, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_amp");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, tx_amp, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, tx_amp, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XPON_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XPON_SERDES_CFG_ID_TX_AMP, &val);
        bcmcli_log(");\n");
    }

    /* call API */
    err = bcmolt_cfg_set(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_set(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xpon_serdes_cfg_clear(bcmolt_devid device_id, bcmcli_session *session)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xpon_serdes_cfg cfg;         /**< declare main API struct */
    bcmolt_xpon_serdes_key key = { };   /**< declare key */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xpon_serdes_cfg cfg;\n");
    bcmcli_log("bcmolt_xpon_serdes_key key = {  };\n");
    apicli_print_start(session, "bcmolt_cfg_clear");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_pon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XPON_SERDES, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XPON_SERDES_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "instance");
    if (cli_parm != NULL)
    {
        key.instance = (bcmolt_serdes_instance) cli_parm->value.enum_val;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "instance is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.instance = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XPON_SERDES, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XPON_SERDES_KEY_ID_INSTANCE, &key.instance);
    bcmcli_log(";\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, xpon_serdes, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, xpon_serdes, key);\n");

    /* call API */
    err = bcmolt_cfg_clear(device_id, &cfg.hdr);
    bcmcli_log("bcmolt_cfg_clear(device_id, &cfg.hdr);\n");
    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_xpon_serdes_cfg_get_multi(bcmolt_devid device_id, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmos_errno err;
    bcmolt_xpon_serdes_cfg cfg;         /**< declare main API struct */
    bcmolt_xpon_serdes_key key = { };   /**< declare key */
    bcmolt_msg_set *msg_set = NULL;     /**< declare message set */
    uint32_t max_msgs;                  /**< declare max number of msgs to get */
    bcmos_bool invert_filter;           /**< declare filter invert flag */
    bcmcli_log("bcmolt_devid device_id = %d;\n", device_id);
    bcmcli_log("bcmolt_xpon_serdes_cfg cfg;\n");
    bcmcli_log("bcmolt_xpon_serdes_key key = {  };\n");
    bcmcli_log("bcmolt_msg_set* msg_set = NULL;\n");
    bcmcli_log("uint32_t max_msgs;\n");
    bcmcli_log("bcmos_bool invert_filter;\n");
    apicli_print_start(session, "bcmolt_cfg_get_multi");

    /* build key from CLI parameters */
    cli_parm = bcmcli_find_named_parm(session, "pon_ni");
    if (cli_parm != NULL)
    {
        key.pon_ni = (bcmolt_pon_ni) cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "pon_ni is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.pon_ni = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XPON_SERDES, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XPON_SERDES_KEY_ID_PON_NI, &key.pon_ni);
    bcmcli_log(";\n");
    cli_parm = bcmcli_find_named_parm(session, "instance");
    if (cli_parm != NULL)
    {
        key.instance = (bcmolt_serdes_instance) cli_parm->value.enum_val;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "instance is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("key.instance = ");
    apicli_log_prop_val(BCMOLT_OBJ_ID_XPON_SERDES, BCMOLT_MGT_GROUP_KEY, 0, BCMOLT_XPON_SERDES_KEY_ID_INSTANCE, &key.instance);
    bcmcli_log(";\n");

    /* set max number of msgs from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "max_msgs");
    if (cli_parm != NULL)
    {
        max_msgs = cli_parm->value.unumber;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "max_msgs is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("max_msgs = %d;\n", max_msgs);

    /* set filter invert flag from CLI parameter */
    cli_parm = bcmcli_find_named_parm(session, "filter_invert");
    if (cli_parm != NULL)
    {
        invert_filter = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "filter_invert is not set\n");
        return BCM_ERR_PARM;
    }

    bcmcli_log("invert_filter = %s;\n", (invert_filter) ? "BCMOS_TRUE" : "BCMOS_FALSE");

    /* allocate message set */
    err = apicli_msg_set_alloc(byte_pool, BCMOLT_OBJ_ID_XPON_SERDES, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);
    if (err != BCM_ERR_OK)
    {
        return err;
    }

    bcmcli_log("bcmolt_msg_set_alloc(BCMOLT_OBJ_ID_XPON_SERDES, BCMOLT_MGT_GROUP_CFG, max_msgs, &msg_set);\n");

    /* init the API struct */
    BCMOLT_CFG_INIT(&cfg, xpon_serdes, key);
    bcmcli_log("BCMOLT_CFG_INIT(&cfg, xpon_serdes, key);\n");

    /* decode API parameters from CLI */
    cli_parm = bcmcli_find_named_parm(session, "filter.rx_vga");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, rx_vga, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, rx_vga, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XPON_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XPON_SERDES_CFG_ID_RX_VGA, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_vga");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xpon_serdes, rx_vga);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xpon_serdes, rx_vga);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.rx_pf");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, rx_pf, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, rx_pf, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XPON_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XPON_SERDES_CFG_ID_RX_PF, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_pf");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xpon_serdes, rx_pf);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xpon_serdes, rx_pf);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.rx_lfpf");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, rx_lfpf, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, rx_lfpf, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XPON_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XPON_SERDES_CFG_ID_RX_LFPF, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_lfpf");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xpon_serdes, rx_lfpf);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xpon_serdes, rx_lfpf);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.rx_dfe1");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, rx_dfe1, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, rx_dfe1, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XPON_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XPON_SERDES_CFG_ID_RX_DFE1, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_dfe1");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xpon_serdes, rx_dfe1);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xpon_serdes, rx_dfe1);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.rx_dfe2");
    if (cli_parm != NULL)
    {
        int8_t val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, rx_dfe2, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, rx_dfe2, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XPON_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XPON_SERDES_CFG_ID_RX_DFE2, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_dfe2");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xpon_serdes, rx_dfe2);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xpon_serdes, rx_dfe2);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.rx_dfe3");
    if (cli_parm != NULL)
    {
        int8_t val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, rx_dfe3, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, rx_dfe3, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XPON_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XPON_SERDES_CFG_ID_RX_DFE3, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_dfe3");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xpon_serdes, rx_dfe3);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xpon_serdes, rx_dfe3);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.rx_dfe4");
    if (cli_parm != NULL)
    {
        int8_t val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, rx_dfe4, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, rx_dfe4, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XPON_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XPON_SERDES_CFG_ID_RX_DFE4, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_dfe4");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xpon_serdes, rx_dfe4);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xpon_serdes, rx_dfe4);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.rx_dfe5");
    if (cli_parm != NULL)
    {
        int8_t val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, rx_dfe5, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, rx_dfe5, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XPON_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XPON_SERDES_CFG_ID_RX_DFE5, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "rx_dfe5");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xpon_serdes, rx_dfe5);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xpon_serdes, rx_dfe5);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.tx_pre");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, tx_pre, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, tx_pre, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XPON_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XPON_SERDES_CFG_ID_TX_PRE, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_pre");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xpon_serdes, tx_pre);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xpon_serdes, tx_pre);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.tx_main");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, tx_main, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, tx_main, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XPON_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XPON_SERDES_CFG_ID_TX_MAIN, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_main");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xpon_serdes, tx_main);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xpon_serdes, tx_main);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.tx_post1");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, tx_post1, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, tx_post1, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XPON_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XPON_SERDES_CFG_ID_TX_POST1, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_post1");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xpon_serdes, tx_post1);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xpon_serdes, tx_post1);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.tx_post2");
    if (cli_parm != NULL)
    {
        int8_t val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, tx_post2, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, tx_post2, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XPON_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XPON_SERDES_CFG_ID_TX_POST2, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_post2");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xpon_serdes, tx_post2);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xpon_serdes, tx_post2);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.tx_post3");
    if (cli_parm != NULL)
    {
        int8_t val;
        val = cli_parm->value.number;
        BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, tx_post3, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, tx_post3, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XPON_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XPON_SERDES_CFG_ID_TX_POST3, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_post3");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xpon_serdes, tx_post3);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xpon_serdes, tx_post3);\n");
        }
    }

    cli_parm = bcmcli_find_named_parm(session, "filter.tx_amp");
    if (cli_parm != NULL)
    {
        uint8_t val;
        val = cli_parm->value.unumber;
        BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, tx_amp, val);
        bcmcli_log("BCMOLT_CFG_PROP_SET(&cfg, xpon_serdes, tx_amp, ");
        apicli_log_prop_val(BCMOLT_OBJ_ID_XPON_SERDES, BCMOLT_MGT_GROUP_CFG, 0, BCMOLT_XPON_SERDES_CFG_ID_TX_AMP, &val);
        bcmcli_log(");\n");
    }

    cli_parm = bcmcli_find_named_parm(session, "tx_amp");
    if (cli_parm != NULL)
    {
        if (cli_parm->value.number)
        {
            BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xpon_serdes, tx_amp);
            bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xpon_serdes, tx_amp);\n");
        }
    }

    /* if no properties were requested, include everything */
    if (!BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xpon_serdes, rx_vga) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xpon_serdes, rx_pf) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xpon_serdes, rx_lfpf) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xpon_serdes, rx_dfe1) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xpon_serdes, rx_dfe2) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xpon_serdes, rx_dfe3) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xpon_serdes, rx_dfe4) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xpon_serdes, rx_dfe5) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xpon_serdes, tx_pre) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xpon_serdes, tx_main) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xpon_serdes, tx_post1) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xpon_serdes, tx_post2) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xpon_serdes, tx_post3) && !BCMOLT_MSGSET_CFG_PROP_IS_SET(msg_set, xpon_serdes, tx_amp))
    {
        BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xpon_serdes, all_properties);
        bcmcli_log("BCMOLT_MSGSET_CFG_PROP_GET(msg_set, xpon_serdes, all_properties);\n");
    }

    /* call API */
    err = bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);
    bcmcli_log("bcmolt_cfg_get_multi(device_id, &cfg.hdr, (invert_filter) ? BCMOLT_FILTER_FLAGS_INVERT_SELECTION : BCMOLT_FILTER_FLAGS_NONE, msg_set);\n");
    if (err == BCM_ERR_OK)
    {
        /* print API contents to the CLI */
        apicli_print_data_start(session);
        err = apicli_msg_dump(session, &cfg.hdr.hdr);
    }

    apicli_print_complete(session, err, cfg.hdr.hdr.err_text);
    return err;
}

/******************************************************************************/
static bcmos_errno bcmolt_cli_api_root(bcmolt_devid device_id, bcmolt_mgt_group group_type, bcmolt_msg_type msg_type, bcmcli_session *session, apicli_byte_pool *byte_pool)
{
    bcmcli_cmd_parm *cli_parm;
    bcmolt_obj_id obj_id;
    cli_parm = bcmcli_find_named_parm(session, "object");
    if (cli_parm != NULL)
    {
        obj_id = cli_parm->value.number;
    }
    else
    {
        apicli_print_complete(session, BCM_ERR_PARM, "object is not set\n");
        return BCM_ERR_PARM;
    }

    switch (obj_id)
    {
        case BCMOLT_OBJ_ID_AE_NI:
            switch (group_type)
            {
                case BCMOLT_MGT_GROUP_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_ae_ni_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_ae_ni_cfg_set(device_id, session);
                        case BCMOLT_MSG_TYPE_CLEAR:
                            return bcmolt_cli_ae_ni_cfg_clear(device_id, session);
                        case BCMOLT_MSG_TYPE_GET_MULTI:
                            return bcmolt_cli_ae_ni_cfg_get_multi(device_id, session, byte_pool);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_OPER:
                    {
                        bcmolt_ae_ni_oper_id sub;
                        cli_parm = bcmcli_find_named_parm(session, "sub");
                        if (cli_parm != NULL)
                        {
                            sub = (bcmolt_ae_ni_oper_id) cli_parm->value.number;
                        }
                        else
                        {
                            apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
                            return BCM_ERR_PARM;
                        }

                        switch (sub)
                        {
                            case BCMOLT_AE_NI_OPER_ID_SET_AE_NI_EN_STATE:
                                return bcmolt_cli_ae_ni_oper_set_ae_ni_en_state_submit(device_id, session);
                            default:
                                return BCM_ERR_RANGE;
                        }
                    }

                default:
                    return BCM_ERR_RANGE;
            }

        case BCMOLT_OBJ_ID_AE_PATH_DS:
            switch (group_type)
            {
                case BCMOLT_MGT_GROUP_STAT:
                    return bcmolt_cli_ae_path_ds_stat_get(device_id, session);
                case BCMOLT_MGT_GROUP_STAT_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_ae_path_ds_stat_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_ae_path_ds_stat_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_AUTO_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_ae_path_ds_auto_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_ae_path_ds_auto_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                default:
                    return BCM_ERR_RANGE;
            }

        case BCMOLT_OBJ_ID_AE_PATH_US:
            switch (group_type)
            {
                case BCMOLT_MGT_GROUP_STAT:
                    return bcmolt_cli_ae_path_us_stat_get(device_id, session);
                case BCMOLT_MGT_GROUP_STAT_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_ae_path_us_stat_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_ae_path_us_stat_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_AUTO_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_ae_path_us_auto_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_ae_path_us_auto_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                default:
                    return BCM_ERR_RANGE;
            }

        case BCMOLT_OBJ_ID_CHANNEL:
            switch (group_type)
            {
                case BCMOLT_MGT_GROUP_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_channel_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_channel_cfg_set(device_id, session);
                        case BCMOLT_MSG_TYPE_CLEAR:
                            return bcmolt_cli_channel_cfg_clear(device_id, session);
                        case BCMOLT_MSG_TYPE_GET_MULTI:
                            return bcmolt_cli_channel_cfg_get_multi(device_id, session, byte_pool);
                        default:
                            return BCM_ERR_RANGE;
                    }

                default:
                    return BCM_ERR_RANGE;
            }

        case BCMOLT_OBJ_ID_DEBUG:
            switch (group_type)
            {
                case BCMOLT_MGT_GROUP_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_debug_cfg_get(device_id, session, byte_pool);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_debug_cfg_set(device_id, session, byte_pool);
                        case BCMOLT_MSG_TYPE_CLEAR:
                            return bcmolt_cli_debug_cfg_clear(device_id, session);
                        case BCMOLT_MSG_TYPE_GET_MULTI:
                            return bcmolt_cli_debug_cfg_get_multi(device_id, session, byte_pool);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_AUTO_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_debug_auto_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_debug_auto_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_OPER:
                    {
                        bcmolt_debug_oper_id sub;
                        cli_parm = bcmcli_find_named_parm(session, "sub");
                        if (cli_parm != NULL)
                        {
                            sub = (bcmolt_debug_oper_id) cli_parm->value.number;
                        }
                        else
                        {
                            apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
                            return BCM_ERR_PARM;
                        }

                        switch (sub)
                        {
                            case BCMOLT_DEBUG_OPER_ID_CLI_INPUT:
                                return bcmolt_cli_debug_oper_cli_input_submit(device_id, session, byte_pool);
                            case BCMOLT_DEBUG_OPER_ID_START_API_CAPTURE:
                                return bcmolt_cli_debug_oper_start_api_capture_submit(device_id, session);
                            case BCMOLT_DEBUG_OPER_ID_STOP_API_CAPTURE:
                                return bcmolt_cli_debug_oper_stop_api_capture_submit(device_id, session);
                            case BCMOLT_DEBUG_OPER_ID_RESET_API_CAPTURE:
                                return bcmolt_cli_debug_oper_reset_api_capture_submit(device_id, session);
                            default:
                                return BCM_ERR_RANGE;
                        }
                    }

                default:
                    return BCM_ERR_RANGE;
            }

        case BCMOLT_OBJ_ID_DEVICE:
            switch (group_type)
            {
                case BCMOLT_MGT_GROUP_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_device_cfg_get(device_id, session, byte_pool);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_device_cfg_set(device_id, session, byte_pool);
                        case BCMOLT_MSG_TYPE_CLEAR:
                            return bcmolt_cli_device_cfg_clear(device_id, session);
                        case BCMOLT_MSG_TYPE_GET_MULTI:
                            return bcmolt_cli_device_cfg_get_multi(device_id, session, byte_pool);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_AUTO_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_device_auto_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_device_auto_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_OPER:
                    {
                        bcmolt_device_oper_id sub;
                        cli_parm = bcmcli_find_named_parm(session, "sub");
                        if (cli_parm != NULL)
                        {
                            sub = (bcmolt_device_oper_id) cli_parm->value.number;
                        }
                        else
                        {
                            apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
                            return BCM_ERR_PARM;
                        }

                        switch (sub)
                        {
                            case BCMOLT_DEVICE_OPER_ID_CONNECT:
                                return bcmolt_cli_device_oper_connect_submit(device_id, session);
                            case BCMOLT_DEVICE_OPER_ID_DISCONNECT:
                                return bcmolt_cli_device_oper_disconnect_submit(device_id, session);
                            case BCMOLT_DEVICE_OPER_ID_RESET:
                                return bcmolt_cli_device_oper_reset_submit(device_id, session);
                            case BCMOLT_DEVICE_OPER_ID_HOST_KEEP_ALIVE:
                                return bcmolt_cli_device_oper_host_keep_alive_submit(device_id, session);
                            case BCMOLT_DEVICE_OPER_ID_SW_UPGRADE_ACTIVATE:
                                return bcmolt_cli_device_oper_sw_upgrade_activate_submit(device_id, session);
                            case BCMOLT_DEVICE_OPER_ID_IMAGE_TRANSFER_START:
                                return bcmolt_cli_device_oper_image_transfer_start_submit(device_id, session);
                            case BCMOLT_DEVICE_OPER_ID_IMAGE_TRANSFER_DATA:
                                return bcmolt_cli_device_oper_image_transfer_data_submit(device_id, session, byte_pool);
                            case BCMOLT_DEVICE_OPER_ID_RUN_DDR_TEST:
                                return bcmolt_cli_device_oper_run_ddr_test_submit(device_id, session);
                            default:
                                return BCM_ERR_RANGE;
                        }
                    }

                default:
                    return BCM_ERR_RANGE;
            }

        case BCMOLT_OBJ_ID_EPON_DENIED_LINK:
            switch (group_type)
            {
                case BCMOLT_MGT_GROUP_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_epon_denied_link_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_epon_denied_link_cfg_set(device_id, session);
                        case BCMOLT_MSG_TYPE_CLEAR:
                            return bcmolt_cli_epon_denied_link_cfg_clear(device_id, session);
                        case BCMOLT_MSG_TYPE_GET_MULTI:
                            return bcmolt_cli_epon_denied_link_cfg_get_multi(device_id, session, byte_pool);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_AUTO_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_epon_denied_link_auto_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_epon_denied_link_auto_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                default:
                    return BCM_ERR_RANGE;
            }

        case BCMOLT_OBJ_ID_EPON_LINK:
            switch (group_type)
            {
                case BCMOLT_MGT_GROUP_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_epon_link_cfg_get(device_id, session, byte_pool);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_epon_link_cfg_set(device_id, session, byte_pool);
                        case BCMOLT_MSG_TYPE_CLEAR:
                            return bcmolt_cli_epon_link_cfg_clear(device_id, session);
                        case BCMOLT_MSG_TYPE_GET_MULTI:
                            return bcmolt_cli_epon_link_cfg_get_multi(device_id, session, byte_pool);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_STAT:
                    return bcmolt_cli_epon_link_stat_get(device_id, session);
                case BCMOLT_MGT_GROUP_STAT_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_epon_link_stat_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_epon_link_stat_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_AUTO_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_epon_link_auto_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_epon_link_auto_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_OPER:
                    {
                        bcmolt_epon_link_oper_id sub;
                        cli_parm = bcmcli_find_named_parm(session, "sub");
                        if (cli_parm != NULL)
                        {
                            sub = (bcmolt_epon_link_oper_id) cli_parm->value.number;
                        }
                        else
                        {
                            apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
                            return BCM_ERR_PARM;
                        }

                        switch (sub)
                        {
                            case BCMOLT_EPON_LINK_OPER_ID_FORCE_REDISCOVERY:
                                return bcmolt_cli_epon_link_oper_force_rediscovery_submit(device_id, session);
                            case BCMOLT_EPON_LINK_OPER_ID_DELETE_LINK:
                                return bcmolt_cli_epon_link_oper_delete_link_submit(device_id, session);
                            case BCMOLT_EPON_LINK_OPER_ID_OAM_KEEPALIVE_TIMER_START:
                                return bcmolt_cli_epon_link_oper_oam_keepalive_timer_start_submit(device_id, session);
                            case BCMOLT_EPON_LINK_OPER_ID_OAM_KEEPALIVE_TIMER_STOP:
                                return bcmolt_cli_epon_link_oper_oam_keepalive_timer_stop_submit(device_id, session);
                            case BCMOLT_EPON_LINK_OPER_ID_KEY_EXCHANGE_START:
                                return bcmolt_cli_epon_link_oper_key_exchange_start_submit(device_id, session);
                            case BCMOLT_EPON_LINK_OPER_ID_KEY_EXCHANGE_STOP:
                                return bcmolt_cli_epon_link_oper_key_exchange_stop_submit(device_id, session);
                            case BCMOLT_EPON_LINK_OPER_ID_STATIC_REGISTRATION:
                                return bcmolt_cli_epon_link_oper_static_registration_submit(device_id, session);
                            default:
                                return BCM_ERR_RANGE;
                        }
                    }

                case BCMOLT_MGT_GROUP_PROXY:
                    {
                        bcmolt_epon_link_proxy_id sub;
                        cli_parm = bcmcli_find_named_parm(session, "sub");
                        if (cli_parm != NULL)
                        {
                            sub = (bcmolt_epon_link_proxy_id) cli_parm->value.number;
                        }
                        else
                        {
                            apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
                            return BCM_ERR_PARM;
                        }

                        switch (sub)
                        {
                            case BCMOLT_EPON_LINK_PROXY_ID_INJECT_FRAME:
                                return bcmolt_cli_epon_link_proxy_inject_frame_send(device_id, session, byte_pool);
                            default:
                                return BCM_ERR_RANGE;
                        }
                    }

                default:
                    return BCM_ERR_RANGE;
            }

        case BCMOLT_OBJ_ID_EPON_NI:
            switch (group_type)
            {
                case BCMOLT_MGT_GROUP_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_epon_ni_cfg_get(device_id, session, byte_pool);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_epon_ni_cfg_set(device_id, session, byte_pool);
                        case BCMOLT_MSG_TYPE_CLEAR:
                            return bcmolt_cli_epon_ni_cfg_clear(device_id, session);
                        case BCMOLT_MSG_TYPE_GET_MULTI:
                            return bcmolt_cli_epon_ni_cfg_get_multi(device_id, session, byte_pool);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_AUTO_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_epon_ni_auto_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_epon_ni_auto_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_OPER:
                    {
                        bcmolt_epon_ni_oper_id sub;
                        cli_parm = bcmcli_find_named_parm(session, "sub");
                        if (cli_parm != NULL)
                        {
                            sub = (bcmolt_epon_ni_oper_id) cli_parm->value.number;
                        }
                        else
                        {
                            apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
                            return BCM_ERR_PARM;
                        }

                        switch (sub)
                        {
                            case BCMOLT_EPON_NI_OPER_ID_SET_EPON_NI_EN_STATE:
                                return bcmolt_cli_epon_ni_oper_set_epon_ni_en_state_submit(device_id, session);
                            case BCMOLT_EPON_NI_OPER_ID_ISSUE_RSSI_GRANT:
                                return bcmolt_cli_epon_ni_oper_issue_rssi_grant_submit(device_id, session);
                            case BCMOLT_EPON_NI_OPER_ID_ADD_LINK:
                                return bcmolt_cli_epon_ni_oper_add_link_submit(device_id, session);
                            case BCMOLT_EPON_NI_OPER_ID_ADD_MULTICAST_LINK:
                                return bcmolt_cli_epon_ni_oper_add_multicast_link_submit(device_id, session);
                            case BCMOLT_EPON_NI_OPER_ID_ADD_PROTECTED_STANDBY_LINK:
                                return bcmolt_cli_epon_ni_oper_add_protected_standby_link_submit(device_id, session);
                            case BCMOLT_EPON_NI_OPER_ID_PROTECTION_SWITCHING_APPLY_RERANGE_DELTA:
                                return bcmolt_cli_epon_ni_oper_protection_switching_apply_rerange_delta_submit(device_id, session);
                            case BCMOLT_EPON_NI_OPER_ID_ROGUE_LLID_SCAN:
                                return bcmolt_cli_epon_ni_oper_rogue_llid_scan_submit(device_id, session);
                            case BCMOLT_EPON_NI_OPER_ID_START_ONU_UPGRADE:
                                return bcmolt_cli_epon_ni_oper_start_onu_upgrade_submit(device_id, session, byte_pool);
                            default:
                                return BCM_ERR_RANGE;
                        }
                    }

                default:
                    return BCM_ERR_RANGE;
            }

        case BCMOLT_OBJ_ID_EPON_ONU_10G_US:
            switch (group_type)
            {
                case BCMOLT_MGT_GROUP_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_epon_onu_10g_us_cfg_get(device_id, session, byte_pool);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_epon_onu_10g_us_cfg_set(device_id, session, byte_pool);
                        case BCMOLT_MSG_TYPE_CLEAR:
                            return bcmolt_cli_epon_onu_10g_us_cfg_clear(device_id, session);
                        case BCMOLT_MSG_TYPE_GET_MULTI:
                            return bcmolt_cli_epon_onu_10g_us_cfg_get_multi(device_id, session, byte_pool);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_STAT:
                    return bcmolt_cli_epon_onu_10g_us_stat_get(device_id, session);
                case BCMOLT_MGT_GROUP_STAT_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_epon_onu_10g_us_stat_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_epon_onu_10g_us_stat_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_AUTO_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_epon_onu_10g_us_auto_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_epon_onu_10g_us_auto_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                default:
                    return BCM_ERR_RANGE;
            }

        case BCMOLT_OBJ_ID_EPON_ONU_1G_US:
            switch (group_type)
            {
                case BCMOLT_MGT_GROUP_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_epon_onu_1g_us_cfg_get(device_id, session, byte_pool);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_epon_onu_1g_us_cfg_set(device_id, session, byte_pool);
                        case BCMOLT_MSG_TYPE_CLEAR:
                            return bcmolt_cli_epon_onu_1g_us_cfg_clear(device_id, session);
                        case BCMOLT_MSG_TYPE_GET_MULTI:
                            return bcmolt_cli_epon_onu_1g_us_cfg_get_multi(device_id, session, byte_pool);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_STAT:
                    return bcmolt_cli_epon_onu_1g_us_stat_get(device_id, session);
                case BCMOLT_MGT_GROUP_STAT_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_epon_onu_1g_us_stat_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_epon_onu_1g_us_stat_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_AUTO_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_epon_onu_1g_us_auto_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_epon_onu_1g_us_auto_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                default:
                    return BCM_ERR_RANGE;
            }

        case BCMOLT_OBJ_ID_EPON_PATH_10G_DS:
            switch (group_type)
            {
                case BCMOLT_MGT_GROUP_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_epon_path_10g_ds_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_epon_path_10g_ds_cfg_set(device_id, session);
                        case BCMOLT_MSG_TYPE_CLEAR:
                            return bcmolt_cli_epon_path_10g_ds_cfg_clear(device_id, session);
                        case BCMOLT_MSG_TYPE_GET_MULTI:
                            return bcmolt_cli_epon_path_10g_ds_cfg_get_multi(device_id, session, byte_pool);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_STAT:
                    return bcmolt_cli_epon_path_10g_ds_stat_get(device_id, session);
                case BCMOLT_MGT_GROUP_STAT_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_epon_path_10g_ds_stat_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_epon_path_10g_ds_stat_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_AUTO_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_epon_path_10g_ds_auto_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_epon_path_10g_ds_auto_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                default:
                    return BCM_ERR_RANGE;
            }

        case BCMOLT_OBJ_ID_EPON_PATH_10G_US:
            switch (group_type)
            {
                case BCMOLT_MGT_GROUP_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_epon_path_10g_us_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_epon_path_10g_us_cfg_set(device_id, session);
                        case BCMOLT_MSG_TYPE_CLEAR:
                            return bcmolt_cli_epon_path_10g_us_cfg_clear(device_id, session);
                        case BCMOLT_MSG_TYPE_GET_MULTI:
                            return bcmolt_cli_epon_path_10g_us_cfg_get_multi(device_id, session, byte_pool);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_STAT:
                    return bcmolt_cli_epon_path_10g_us_stat_get(device_id, session);
                case BCMOLT_MGT_GROUP_STAT_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_epon_path_10g_us_stat_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_epon_path_10g_us_stat_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_AUTO_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_epon_path_10g_us_auto_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_epon_path_10g_us_auto_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                default:
                    return BCM_ERR_RANGE;
            }

        case BCMOLT_OBJ_ID_EPON_PATH_1G_DS:
            switch (group_type)
            {
                case BCMOLT_MGT_GROUP_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_epon_path_1g_ds_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_epon_path_1g_ds_cfg_set(device_id, session);
                        case BCMOLT_MSG_TYPE_CLEAR:
                            return bcmolt_cli_epon_path_1g_ds_cfg_clear(device_id, session);
                        case BCMOLT_MSG_TYPE_GET_MULTI:
                            return bcmolt_cli_epon_path_1g_ds_cfg_get_multi(device_id, session, byte_pool);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_STAT:
                    return bcmolt_cli_epon_path_1g_ds_stat_get(device_id, session);
                case BCMOLT_MGT_GROUP_STAT_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_epon_path_1g_ds_stat_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_epon_path_1g_ds_stat_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_AUTO_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_epon_path_1g_ds_auto_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_epon_path_1g_ds_auto_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                default:
                    return BCM_ERR_RANGE;
            }

        case BCMOLT_OBJ_ID_EPON_PATH_1G_US:
            switch (group_type)
            {
                case BCMOLT_MGT_GROUP_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_epon_path_1g_us_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_epon_path_1g_us_cfg_set(device_id, session);
                        case BCMOLT_MSG_TYPE_CLEAR:
                            return bcmolt_cli_epon_path_1g_us_cfg_clear(device_id, session);
                        case BCMOLT_MSG_TYPE_GET_MULTI:
                            return bcmolt_cli_epon_path_1g_us_cfg_get_multi(device_id, session, byte_pool);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_STAT:
                    return bcmolt_cli_epon_path_1g_us_stat_get(device_id, session);
                case BCMOLT_MGT_GROUP_STAT_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_epon_path_1g_us_stat_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_epon_path_1g_us_stat_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_AUTO_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_epon_path_1g_us_auto_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_epon_path_1g_us_auto_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                default:
                    return BCM_ERR_RANGE;
            }

        case BCMOLT_OBJ_ID_EPON_RP:
            switch (group_type)
            {
                case BCMOLT_MGT_GROUP_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_epon_rp_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_epon_rp_cfg_set(device_id, session);
                        case BCMOLT_MSG_TYPE_CLEAR:
                            return bcmolt_cli_epon_rp_cfg_clear(device_id, session);
                        case BCMOLT_MSG_TYPE_GET_MULTI:
                            return bcmolt_cli_epon_rp_cfg_get_multi(device_id, session, byte_pool);
                        default:
                            return BCM_ERR_RANGE;
                    }

                default:
                    return BCM_ERR_RANGE;
            }

        case BCMOLT_OBJ_ID_GPIO:
            switch (group_type)
            {
                case BCMOLT_MGT_GROUP_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_gpio_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_gpio_cfg_set(device_id, session);
                        case BCMOLT_MSG_TYPE_CLEAR:
                            return bcmolt_cli_gpio_cfg_clear(device_id, session);
                        case BCMOLT_MSG_TYPE_GET_MULTI:
                            return bcmolt_cli_gpio_cfg_get_multi(device_id, session, byte_pool);
                        default:
                            return BCM_ERR_RANGE;
                    }

                default:
                    return BCM_ERR_RANGE;
            }

        case BCMOLT_OBJ_ID_GPON_ALLOC:
            switch (group_type)
            {
                case BCMOLT_MGT_GROUP_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_gpon_alloc_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_gpon_alloc_cfg_set(device_id, session);
                        case BCMOLT_MSG_TYPE_CLEAR:
                            return bcmolt_cli_gpon_alloc_cfg_clear(device_id, session);
                        case BCMOLT_MSG_TYPE_GET_MULTI:
                            return bcmolt_cli_gpon_alloc_cfg_get_multi(device_id, session, byte_pool);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_STAT:
                    return bcmolt_cli_gpon_alloc_stat_get(device_id, session);
                case BCMOLT_MGT_GROUP_STAT_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_gpon_alloc_stat_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_gpon_alloc_stat_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_AUTO_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_gpon_alloc_auto_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_gpon_alloc_auto_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_OPER:
                    {
                        bcmolt_gpon_alloc_oper_id sub;
                        cli_parm = bcmcli_find_named_parm(session, "sub");
                        if (cli_parm != NULL)
                        {
                            sub = (bcmolt_gpon_alloc_oper_id) cli_parm->value.number;
                        }
                        else
                        {
                            apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
                            return BCM_ERR_PARM;
                        }

                        switch (sub)
                        {
                            case BCMOLT_GPON_ALLOC_OPER_ID_SET_STATE:
                                return bcmolt_cli_gpon_alloc_oper_set_state_submit(device_id, session);
                            case BCMOLT_GPON_ALLOC_OPER_ID_GET_STATS:
                                return bcmolt_cli_gpon_alloc_oper_get_stats_submit(device_id, session);
                            default:
                                return BCM_ERR_RANGE;
                        }
                    }

                default:
                    return BCM_ERR_RANGE;
            }

        case BCMOLT_OBJ_ID_GPON_GEM_PORT:
            switch (group_type)
            {
                case BCMOLT_MGT_GROUP_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_gpon_gem_port_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_gpon_gem_port_cfg_set(device_id, session);
                        case BCMOLT_MSG_TYPE_CLEAR:
                            return bcmolt_cli_gpon_gem_port_cfg_clear(device_id, session);
                        case BCMOLT_MSG_TYPE_GET_MULTI:
                            return bcmolt_cli_gpon_gem_port_cfg_get_multi(device_id, session, byte_pool);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_STAT:
                    return bcmolt_cli_gpon_gem_port_stat_get(device_id, session);
                case BCMOLT_MGT_GROUP_STAT_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_gpon_gem_port_stat_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_gpon_gem_port_stat_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_AUTO_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_gpon_gem_port_auto_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_gpon_gem_port_auto_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_OPER:
                    {
                        bcmolt_gpon_gem_port_oper_id sub;
                        cli_parm = bcmcli_find_named_parm(session, "sub");
                        if (cli_parm != NULL)
                        {
                            sub = (bcmolt_gpon_gem_port_oper_id) cli_parm->value.number;
                        }
                        else
                        {
                            apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
                            return BCM_ERR_PARM;
                        }

                        switch (sub)
                        {
                            case BCMOLT_GPON_GEM_PORT_OPER_ID_SET_STATE:
                                return bcmolt_cli_gpon_gem_port_oper_set_state_submit(device_id, session);
                            default:
                                return BCM_ERR_RANGE;
                        }
                    }

                default:
                    return BCM_ERR_RANGE;
            }

        case BCMOLT_OBJ_ID_GPON_IWF:
            switch (group_type)
            {
                case BCMOLT_MGT_GROUP_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_gpon_iwf_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_gpon_iwf_cfg_set(device_id, session);
                        case BCMOLT_MSG_TYPE_CLEAR:
                            return bcmolt_cli_gpon_iwf_cfg_clear(device_id, session);
                        case BCMOLT_MSG_TYPE_GET_MULTI:
                            return bcmolt_cli_gpon_iwf_cfg_get_multi(device_id, session, byte_pool);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_STAT:
                    return bcmolt_cli_gpon_iwf_stat_get(device_id, session);
                case BCMOLT_MGT_GROUP_STAT_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_gpon_iwf_stat_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_gpon_iwf_stat_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_AUTO_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_gpon_iwf_auto_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_gpon_iwf_auto_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_OPER:
                    {
                        bcmolt_gpon_iwf_oper_id sub;
                        cli_parm = bcmcli_find_named_parm(session, "sub");
                        if (cli_parm != NULL)
                        {
                            sub = (bcmolt_gpon_iwf_oper_id) cli_parm->value.number;
                        }
                        else
                        {
                            apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
                            return BCM_ERR_PARM;
                        }

                        switch (sub)
                        {
                            case BCMOLT_GPON_IWF_OPER_ID_FLUSH_MAC_TABLE:
                                return bcmolt_cli_gpon_iwf_oper_flush_mac_table_submit(device_id, session);
                            case BCMOLT_GPON_IWF_OPER_ID_SCAN_MAC_TABLE:
                                return bcmolt_cli_gpon_iwf_oper_scan_mac_table_submit(device_id, session);
                            default:
                                return BCM_ERR_RANGE;
                        }
                    }

                default:
                    return BCM_ERR_RANGE;
            }

        case BCMOLT_OBJ_ID_GPON_IWF_DS_EGRESS_FLOW:
            switch (group_type)
            {
                case BCMOLT_MGT_GROUP_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_gpon_iwf_ds_egress_flow_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_gpon_iwf_ds_egress_flow_cfg_set(device_id, session);
                        case BCMOLT_MSG_TYPE_CLEAR:
                            return bcmolt_cli_gpon_iwf_ds_egress_flow_cfg_clear(device_id, session);
                        case BCMOLT_MSG_TYPE_GET_MULTI:
                            return bcmolt_cli_gpon_iwf_ds_egress_flow_cfg_get_multi(device_id, session, byte_pool);
                        default:
                            return BCM_ERR_RANGE;
                    }

                default:
                    return BCM_ERR_RANGE;
            }

        case BCMOLT_OBJ_ID_GPON_IWF_DS_INGRESS_FLOW:
            switch (group_type)
            {
                case BCMOLT_MGT_GROUP_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_gpon_iwf_ds_ingress_flow_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_gpon_iwf_ds_ingress_flow_cfg_set(device_id, session);
                        case BCMOLT_MSG_TYPE_CLEAR:
                            return bcmolt_cli_gpon_iwf_ds_ingress_flow_cfg_clear(device_id, session);
                        case BCMOLT_MSG_TYPE_GET_MULTI:
                            return bcmolt_cli_gpon_iwf_ds_ingress_flow_cfg_get_multi(device_id, session, byte_pool);
                        default:
                            return BCM_ERR_RANGE;
                    }

                default:
                    return BCM_ERR_RANGE;
            }

        case BCMOLT_OBJ_ID_GPON_IWF_MAC_TABLE:
            switch (group_type)
            {
                case BCMOLT_MGT_GROUP_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_gpon_iwf_mac_table_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_gpon_iwf_mac_table_cfg_set(device_id, session);
                        case BCMOLT_MSG_TYPE_CLEAR:
                            return bcmolt_cli_gpon_iwf_mac_table_cfg_clear(device_id, session);
                        case BCMOLT_MSG_TYPE_GET_MULTI:
                            return bcmolt_cli_gpon_iwf_mac_table_cfg_get_multi(device_id, session, byte_pool);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_AUTO_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_gpon_iwf_mac_table_auto_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_gpon_iwf_mac_table_auto_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                default:
                    return BCM_ERR_RANGE;
            }

        case BCMOLT_OBJ_ID_GPON_IWF_US_FLOW:
            switch (group_type)
            {
                case BCMOLT_MGT_GROUP_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_gpon_iwf_us_flow_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_gpon_iwf_us_flow_cfg_set(device_id, session);
                        case BCMOLT_MSG_TYPE_CLEAR:
                            return bcmolt_cli_gpon_iwf_us_flow_cfg_clear(device_id, session);
                        case BCMOLT_MSG_TYPE_GET_MULTI:
                            return bcmolt_cli_gpon_iwf_us_flow_cfg_get_multi(device_id, session, byte_pool);
                        default:
                            return BCM_ERR_RANGE;
                    }

                default:
                    return BCM_ERR_RANGE;
            }

        case BCMOLT_OBJ_ID_GPON_NI:
            switch (group_type)
            {
                case BCMOLT_MGT_GROUP_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_gpon_ni_cfg_get(device_id, session, byte_pool);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_gpon_ni_cfg_set(device_id, session, byte_pool);
                        case BCMOLT_MSG_TYPE_CLEAR:
                            return bcmolt_cli_gpon_ni_cfg_clear(device_id, session);
                        case BCMOLT_MSG_TYPE_GET_MULTI:
                            return bcmolt_cli_gpon_ni_cfg_get_multi(device_id, session, byte_pool);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_STAT:
                    return bcmolt_cli_gpon_ni_stat_get(device_id, session);
                case BCMOLT_MGT_GROUP_STAT_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_gpon_ni_stat_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_gpon_ni_stat_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_AUTO_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_gpon_ni_auto_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_gpon_ni_auto_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_OPER:
                    {
                        bcmolt_gpon_ni_oper_id sub;
                        cli_parm = bcmcli_find_named_parm(session, "sub");
                        if (cli_parm != NULL)
                        {
                            sub = (bcmolt_gpon_ni_oper_id) cli_parm->value.number;
                        }
                        else
                        {
                            apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
                            return BCM_ERR_PARM;
                        }

                        switch (sub)
                        {
                            case BCMOLT_GPON_NI_OPER_ID_SET_PON_STATE:
                                return bcmolt_cli_gpon_ni_oper_set_pon_state_submit(device_id, session);
                            case BCMOLT_GPON_NI_OPER_ID_RESET:
                                return bcmolt_cli_gpon_ni_oper_reset_submit(device_id, session);
                            case BCMOLT_GPON_NI_OPER_ID_DISABLE_SERIAL_NUMBER:
                                return bcmolt_cli_gpon_ni_oper_disable_serial_number_submit(device_id, session);
                            case BCMOLT_GPON_NI_OPER_ID_SINGLE_REQUEST_STANDBY_PON_MONITORING:
                                return bcmolt_cli_gpon_ni_oper_single_request_standby_pon_monitoring_submit(device_id, session);
                            case BCMOLT_GPON_NI_OPER_ID_SET_ONU_STATE:
                                return bcmolt_cli_gpon_ni_oper_set_onu_state_submit(device_id, session);
                            case BCMOLT_GPON_NI_OPER_ID_ROGUE_DETECTION_WINDOW:
                                return bcmolt_cli_gpon_ni_oper_rogue_detection_window_submit(device_id, session);
                            case BCMOLT_GPON_NI_OPER_ID_TOD_REQUEST:
                                return bcmolt_cli_gpon_ni_oper_tod_request_submit(device_id, session);
                            case BCMOLT_GPON_NI_OPER_ID_PROTECTION_SWITCHING_TYPE_C_SET_MULTIPLE_ONU_STATE:
                                return bcmolt_cli_gpon_ni_oper_protection_switching_type_c_set_multiple_onu_state_submit(device_id, session, byte_pool);
                            case BCMOLT_GPON_NI_OPER_ID_START_ONU_UPGRADE:
                                return bcmolt_cli_gpon_ni_oper_start_onu_upgrade_submit(device_id, session, byte_pool);
                            default:
                                return BCM_ERR_RANGE;
                        }
                    }

                case BCMOLT_MGT_GROUP_PROXY:
                    {
                        bcmolt_gpon_ni_proxy_id sub;
                        cli_parm = bcmcli_find_named_parm(session, "sub");
                        if (cli_parm != NULL)
                        {
                            sub = (bcmolt_gpon_ni_proxy_id) cli_parm->value.number;
                        }
                        else
                        {
                            apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
                            return BCM_ERR_PARM;
                        }

                        switch (sub)
                        {
                            case BCMOLT_GPON_NI_PROXY_ID_CPU_PACKETS:
                                return bcmolt_cli_gpon_ni_proxy_cpu_packets_send(device_id, session, byte_pool);
                            case BCMOLT_GPON_NI_PROXY_ID_BROADCAST_PLOAM_PACKET:
                                return bcmolt_cli_gpon_ni_proxy_broadcast_ploam_packet_send(device_id, session);
                            default:
                                return BCM_ERR_RANGE;
                        }
                    }

                default:
                    return BCM_ERR_RANGE;
            }

        case BCMOLT_OBJ_ID_GPON_ONU:
            switch (group_type)
            {
                case BCMOLT_MGT_GROUP_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_gpon_onu_cfg_get(device_id, session, byte_pool);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_gpon_onu_cfg_set(device_id, session, byte_pool);
                        case BCMOLT_MSG_TYPE_CLEAR:
                            return bcmolt_cli_gpon_onu_cfg_clear(device_id, session);
                        case BCMOLT_MSG_TYPE_GET_MULTI:
                            return bcmolt_cli_gpon_onu_cfg_get_multi(device_id, session, byte_pool);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_STAT:
                    return bcmolt_cli_gpon_onu_stat_get(device_id, session);
                case BCMOLT_MGT_GROUP_STAT_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_gpon_onu_stat_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_gpon_onu_stat_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_AUTO_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_gpon_onu_auto_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_gpon_onu_auto_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_OPER:
                    {
                        bcmolt_gpon_onu_oper_id sub;
                        cli_parm = bcmcli_find_named_parm(session, "sub");
                        if (cli_parm != NULL)
                        {
                            sub = (bcmolt_gpon_onu_oper_id) cli_parm->value.number;
                        }
                        else
                        {
                            apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
                            return BCM_ERR_PARM;
                        }

                        switch (sub)
                        {
                            case BCMOLT_GPON_ONU_OPER_ID_SET_ONU_STATE:
                                return bcmolt_cli_gpon_onu_oper_set_onu_state_submit(device_id, session);
                            case BCMOLT_GPON_ONU_OPER_ID_RSSI_MEASUREMENT:
                                return bcmolt_cli_gpon_onu_oper_rssi_measurement_submit(device_id, session);
                            case BCMOLT_GPON_ONU_OPER_ID_CHANGE_POWER_LEVEL:
                                return bcmolt_cli_gpon_onu_oper_change_power_level_submit(device_id, session);
                            default:
                                return BCM_ERR_RANGE;
                        }
                    }

                case BCMOLT_MGT_GROUP_PROXY:
                    {
                        bcmolt_gpon_onu_proxy_id sub;
                        cli_parm = bcmcli_find_named_parm(session, "sub");
                        if (cli_parm != NULL)
                        {
                            sub = (bcmolt_gpon_onu_proxy_id) cli_parm->value.number;
                        }
                        else
                        {
                            apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
                            return BCM_ERR_PARM;
                        }

                        switch (sub)
                        {
                            case BCMOLT_GPON_ONU_PROXY_ID_CPU_PACKETS:
                                return bcmolt_cli_gpon_onu_proxy_cpu_packets_send(device_id, session, byte_pool);
                            case BCMOLT_GPON_ONU_PROXY_ID_PLOAM_PACKET:
                                return bcmolt_cli_gpon_onu_proxy_ploam_packet_send(device_id, session);
                            default:
                                return BCM_ERR_RANGE;
                        }
                    }

                default:
                    return BCM_ERR_RANGE;
            }

        case BCMOLT_OBJ_ID_GPON_TRX:
            switch (group_type)
            {
                case BCMOLT_MGT_GROUP_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_gpon_trx_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_gpon_trx_cfg_set(device_id, session);
                        case BCMOLT_MSG_TYPE_CLEAR:
                            return bcmolt_cli_gpon_trx_cfg_clear(device_id, session);
                        case BCMOLT_MSG_TYPE_GET_MULTI:
                            return bcmolt_cli_gpon_trx_cfg_get_multi(device_id, session, byte_pool);
                        default:
                            return BCM_ERR_RANGE;
                    }

                default:
                    return BCM_ERR_RANGE;
            }

        case BCMOLT_OBJ_ID_LOG_ENTRY:
            switch (group_type)
            {
                case BCMOLT_MGT_GROUP_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_log_entry_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_log_entry_cfg_set(device_id, session);
                        case BCMOLT_MSG_TYPE_CLEAR:
                            return bcmolt_cli_log_entry_cfg_clear(device_id, session);
                        case BCMOLT_MSG_TYPE_GET_MULTI:
                            return bcmolt_cli_log_entry_cfg_get_multi(device_id, session, byte_pool);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_STAT:
                    return bcmolt_cli_log_entry_stat_get(device_id, session);
                case BCMOLT_MGT_GROUP_STAT_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_log_entry_stat_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_log_entry_stat_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_AUTO_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_log_entry_auto_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_log_entry_auto_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                default:
                    return BCM_ERR_RANGE;
            }

        case BCMOLT_OBJ_ID_LOGGER:
            switch (group_type)
            {
                case BCMOLT_MGT_GROUP_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_logger_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_logger_cfg_set(device_id, session);
                        case BCMOLT_MSG_TYPE_CLEAR:
                            return bcmolt_cli_logger_cfg_clear(device_id, session);
                        case BCMOLT_MSG_TYPE_GET_MULTI:
                            return bcmolt_cli_logger_cfg_get_multi(device_id, session, byte_pool);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_STAT:
                    return bcmolt_cli_logger_stat_get(device_id, session);
                case BCMOLT_MGT_GROUP_STAT_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_logger_stat_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_logger_stat_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_AUTO_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_logger_auto_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_logger_auto_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_OPER:
                    {
                        bcmolt_logger_oper_id sub;
                        cli_parm = bcmcli_find_named_parm(session, "sub");
                        if (cli_parm != NULL)
                        {
                            sub = (bcmolt_logger_oper_id) cli_parm->value.number;
                        }
                        else
                        {
                            apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
                            return BCM_ERR_PARM;
                        }

                        switch (sub)
                        {
                            case BCMOLT_LOGGER_OPER_ID_CLEAR_LOG:
                                return bcmolt_cli_logger_oper_clear_log_submit(device_id, session);
                            default:
                                return BCM_ERR_RANGE;
                        }
                    }

                default:
                    return BCM_ERR_RANGE;
            }

        case BCMOLT_OBJ_ID_NNI:
            switch (group_type)
            {
                case BCMOLT_MGT_GROUP_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_nni_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_nni_cfg_set(device_id, session);
                        case BCMOLT_MSG_TYPE_CLEAR:
                            return bcmolt_cli_nni_cfg_clear(device_id, session);
                        case BCMOLT_MSG_TYPE_GET_MULTI:
                            return bcmolt_cli_nni_cfg_get_multi(device_id, session, byte_pool);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_STAT:
                    return bcmolt_cli_nni_stat_get(device_id, session);
                case BCMOLT_MGT_GROUP_STAT_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_nni_stat_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_nni_stat_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_AUTO_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_nni_auto_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_nni_auto_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                default:
                    return BCM_ERR_RANGE;
            }

        case BCMOLT_OBJ_ID_NNI_SERDES:
            switch (group_type)
            {
                case BCMOLT_MGT_GROUP_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_nni_serdes_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_nni_serdes_cfg_set(device_id, session);
                        case BCMOLT_MSG_TYPE_CLEAR:
                            return bcmolt_cli_nni_serdes_cfg_clear(device_id, session);
                        case BCMOLT_MSG_TYPE_GET_MULTI:
                            return bcmolt_cli_nni_serdes_cfg_get_multi(device_id, session, byte_pool);
                        default:
                            return BCM_ERR_RANGE;
                    }

                default:
                    return BCM_ERR_RANGE;
            }

        case BCMOLT_OBJ_ID_SOFTWARE_ERROR:
            switch (group_type)
            {
                case BCMOLT_MGT_GROUP_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_software_error_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_software_error_cfg_set(device_id, session);
                        case BCMOLT_MSG_TYPE_CLEAR:
                            return bcmolt_cli_software_error_cfg_clear(device_id, session);
                        case BCMOLT_MSG_TYPE_GET_MULTI:
                            return bcmolt_cli_software_error_cfg_get_multi(device_id, session, byte_pool);
                        default:
                            return BCM_ERR_RANGE;
                    }

                default:
                    return BCM_ERR_RANGE;
            }

        case BCMOLT_OBJ_ID_TRX_CALIBRATION:
            switch (group_type)
            {
                case BCMOLT_MGT_GROUP_AUTO_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_trx_calibration_auto_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_trx_calibration_auto_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_OPER:
                    {
                        bcmolt_trx_calibration_oper_id sub;
                        cli_parm = bcmcli_find_named_parm(session, "sub");
                        if (cli_parm != NULL)
                        {
                            sub = (bcmolt_trx_calibration_oper_id) cli_parm->value.number;
                        }
                        else
                        {
                            apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
                            return BCM_ERR_PARM;
                        }

                        switch (sub)
                        {
                            case BCMOLT_TRX_CALIBRATION_OPER_ID_START_CAPTURE_WINDOW:
                                return bcmolt_cli_trx_calibration_oper_start_capture_window_submit(device_id, session);
                            case BCMOLT_TRX_CALIBRATION_OPER_ID_STOP_CAPTURE_WINDOW:
                                return bcmolt_cli_trx_calibration_oper_stop_capture_window_submit(device_id, session);
                            default:
                                return BCM_ERR_RANGE;
                        }
                    }

                default:
                    return BCM_ERR_RANGE;
            }

        case BCMOLT_OBJ_ID_XGPON_ALLOC:
            switch (group_type)
            {
                case BCMOLT_MGT_GROUP_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_xgpon_alloc_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_xgpon_alloc_cfg_set(device_id, session);
                        case BCMOLT_MSG_TYPE_CLEAR:
                            return bcmolt_cli_xgpon_alloc_cfg_clear(device_id, session);
                        case BCMOLT_MSG_TYPE_GET_MULTI:
                            return bcmolt_cli_xgpon_alloc_cfg_get_multi(device_id, session, byte_pool);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_STAT:
                    return bcmolt_cli_xgpon_alloc_stat_get(device_id, session);
                case BCMOLT_MGT_GROUP_STAT_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_xgpon_alloc_stat_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_xgpon_alloc_stat_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_AUTO_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_xgpon_alloc_auto_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_xgpon_alloc_auto_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_OPER:
                    {
                        bcmolt_xgpon_alloc_oper_id sub;
                        cli_parm = bcmcli_find_named_parm(session, "sub");
                        if (cli_parm != NULL)
                        {
                            sub = (bcmolt_xgpon_alloc_oper_id) cli_parm->value.number;
                        }
                        else
                        {
                            apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
                            return BCM_ERR_PARM;
                        }

                        switch (sub)
                        {
                            case BCMOLT_XGPON_ALLOC_OPER_ID_GET_STATS:
                                return bcmolt_cli_xgpon_alloc_oper_get_stats_submit(device_id, session);
                            case BCMOLT_XGPON_ALLOC_OPER_ID_SET_STATE:
                                return bcmolt_cli_xgpon_alloc_oper_set_state_submit(device_id, session);
                            default:
                                return BCM_ERR_RANGE;
                        }
                    }

                default:
                    return BCM_ERR_RANGE;
            }

        case BCMOLT_OBJ_ID_XGPON_GEM_PORT:
            switch (group_type)
            {
                case BCMOLT_MGT_GROUP_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_xgpon_gem_port_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_xgpon_gem_port_cfg_set(device_id, session);
                        case BCMOLT_MSG_TYPE_CLEAR:
                            return bcmolt_cli_xgpon_gem_port_cfg_clear(device_id, session);
                        case BCMOLT_MSG_TYPE_GET_MULTI:
                            return bcmolt_cli_xgpon_gem_port_cfg_get_multi(device_id, session, byte_pool);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_STAT:
                    return bcmolt_cli_xgpon_gem_port_stat_get(device_id, session);
                case BCMOLT_MGT_GROUP_STAT_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_xgpon_gem_port_stat_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_xgpon_gem_port_stat_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_AUTO_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_xgpon_gem_port_auto_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_xgpon_gem_port_auto_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                default:
                    return BCM_ERR_RANGE;
            }

        case BCMOLT_OBJ_ID_XGPON_IWF:
            switch (group_type)
            {
                case BCMOLT_MGT_GROUP_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_xgpon_iwf_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_xgpon_iwf_cfg_set(device_id, session);
                        case BCMOLT_MSG_TYPE_CLEAR:
                            return bcmolt_cli_xgpon_iwf_cfg_clear(device_id, session);
                        case BCMOLT_MSG_TYPE_GET_MULTI:
                            return bcmolt_cli_xgpon_iwf_cfg_get_multi(device_id, session, byte_pool);
                        default:
                            return BCM_ERR_RANGE;
                    }

                default:
                    return BCM_ERR_RANGE;
            }

        case BCMOLT_OBJ_ID_XGPON_NI:
            switch (group_type)
            {
                case BCMOLT_MGT_GROUP_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_xgpon_ni_cfg_get(device_id, session, byte_pool);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_xgpon_ni_cfg_set(device_id, session, byte_pool);
                        case BCMOLT_MSG_TYPE_CLEAR:
                            return bcmolt_cli_xgpon_ni_cfg_clear(device_id, session);
                        case BCMOLT_MSG_TYPE_GET_MULTI:
                            return bcmolt_cli_xgpon_ni_cfg_get_multi(device_id, session, byte_pool);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_STAT:
                    return bcmolt_cli_xgpon_ni_stat_get(device_id, session);
                case BCMOLT_MGT_GROUP_STAT_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_xgpon_ni_stat_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_xgpon_ni_stat_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_AUTO_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_xgpon_ni_auto_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_xgpon_ni_auto_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_OPER:
                    {
                        bcmolt_xgpon_ni_oper_id sub;
                        cli_parm = bcmcli_find_named_parm(session, "sub");
                        if (cli_parm != NULL)
                        {
                            sub = (bcmolt_xgpon_ni_oper_id) cli_parm->value.number;
                        }
                        else
                        {
                            apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
                            return BCM_ERR_PARM;
                        }

                        switch (sub)
                        {
                            case BCMOLT_XGPON_NI_OPER_ID_SET_PON_STATE:
                                return bcmolt_cli_xgpon_ni_oper_set_pon_state_submit(device_id, session);
                            case BCMOLT_XGPON_NI_OPER_ID_RESET:
                                return bcmolt_cli_xgpon_ni_oper_reset_submit(device_id, session);
                            case BCMOLT_XGPON_NI_OPER_ID_DISABLE_SERIAL_NUMBER:
                                return bcmolt_cli_xgpon_ni_oper_disable_serial_number_submit(device_id, session);
                            case BCMOLT_XGPON_NI_OPER_ID_SINGLE_REQUEST_STANDBY_PON_MONITORING:
                                return bcmolt_cli_xgpon_ni_oper_single_request_standby_pon_monitoring_submit(device_id, session);
                            case BCMOLT_XGPON_NI_OPER_ID_SET_ONU_STATE:
                                return bcmolt_cli_xgpon_ni_oper_set_onu_state_submit(device_id, session);
                            case BCMOLT_XGPON_NI_OPER_ID_RUN_SPECIAL_BW_MAP:
                                return bcmolt_cli_xgpon_ni_oper_run_special_bw_map_submit(device_id, session);
                            case BCMOLT_XGPON_NI_OPER_ID_ROGUE_DETECTION_WINDOW:
                                return bcmolt_cli_xgpon_ni_oper_rogue_detection_window_submit(device_id, session);
                            case BCMOLT_XGPON_NI_OPER_ID_TOD_REQUEST:
                                return bcmolt_cli_xgpon_ni_oper_tod_request_submit(device_id, session);
                            case BCMOLT_XGPON_NI_OPER_ID_START_ONU_UPGRADE:
                                return bcmolt_cli_xgpon_ni_oper_start_onu_upgrade_submit(device_id, session, byte_pool);
                            case BCMOLT_XGPON_NI_OPER_ID_ADJUST_TX_WAVELENGTH:
                                return bcmolt_cli_xgpon_ni_oper_adjust_tx_wavelength_submit(device_id, session);
                            default:
                                return BCM_ERR_RANGE;
                        }
                    }

                case BCMOLT_MGT_GROUP_PROXY:
                    {
                        bcmolt_xgpon_ni_proxy_id sub;
                        cli_parm = bcmcli_find_named_parm(session, "sub");
                        if (cli_parm != NULL)
                        {
                            sub = (bcmolt_xgpon_ni_proxy_id) cli_parm->value.number;
                        }
                        else
                        {
                            apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
                            return BCM_ERR_PARM;
                        }

                        switch (sub)
                        {
                            case BCMOLT_XGPON_NI_PROXY_ID_CPU_PACKETS:
                                return bcmolt_cli_xgpon_ni_proxy_cpu_packets_send(device_id, session, byte_pool);
                            case BCMOLT_XGPON_NI_PROXY_ID_BROADCAST_PLOAM_PACKET:
                                return bcmolt_cli_xgpon_ni_proxy_broadcast_ploam_packet_send(device_id, session);
                            default:
                                return BCM_ERR_RANGE;
                        }
                    }

                default:
                    return BCM_ERR_RANGE;
            }

        case BCMOLT_OBJ_ID_XGPON_ONU:
            switch (group_type)
            {
                case BCMOLT_MGT_GROUP_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_xgpon_onu_cfg_get(device_id, session, byte_pool);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_xgpon_onu_cfg_set(device_id, session, byte_pool);
                        case BCMOLT_MSG_TYPE_CLEAR:
                            return bcmolt_cli_xgpon_onu_cfg_clear(device_id, session);
                        case BCMOLT_MSG_TYPE_GET_MULTI:
                            return bcmolt_cli_xgpon_onu_cfg_get_multi(device_id, session, byte_pool);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_STAT:
                    return bcmolt_cli_xgpon_onu_stat_get(device_id, session);
                case BCMOLT_MGT_GROUP_STAT_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_xgpon_onu_stat_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_xgpon_onu_stat_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_AUTO_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_xgpon_onu_auto_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_xgpon_onu_auto_cfg_set(device_id, session);
                        default:
                            return BCM_ERR_RANGE;
                    }

                case BCMOLT_MGT_GROUP_OPER:
                    {
                        bcmolt_xgpon_onu_oper_id sub;
                        cli_parm = bcmcli_find_named_parm(session, "sub");
                        if (cli_parm != NULL)
                        {
                            sub = (bcmolt_xgpon_onu_oper_id) cli_parm->value.number;
                        }
                        else
                        {
                            apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
                            return BCM_ERR_PARM;
                        }

                        switch (sub)
                        {
                            case BCMOLT_XGPON_ONU_OPER_ID_SET_ONU_STATE:
                                return bcmolt_cli_xgpon_onu_oper_set_onu_state_submit(device_id, session);
                            case BCMOLT_XGPON_ONU_OPER_ID_RSSI_MEASUREMENT:
                                return bcmolt_cli_xgpon_onu_oper_rssi_measurement_submit(device_id, session);
                            case BCMOLT_XGPON_ONU_OPER_ID_REQUEST_REGISTRATION:
                                return bcmolt_cli_xgpon_onu_oper_request_registration_submit(device_id, session);
                            case BCMOLT_XGPON_ONU_OPER_ID_CHANGE_POWER_LEVELLING:
                                return bcmolt_cli_xgpon_onu_oper_change_power_levelling_submit(device_id, session);
                            case BCMOLT_XGPON_ONU_OPER_ID_GET_POWER_LEVEL:
                                return bcmolt_cli_xgpon_onu_oper_get_power_level_submit(device_id, session);
                            case BCMOLT_XGPON_ONU_OPER_ID_GET_POWER_CONSUMPTION:
                                return bcmolt_cli_xgpon_onu_oper_get_power_consumption_submit(device_id, session);
                            case BCMOLT_XGPON_ONU_OPER_ID_ADJUST_TX_WAVELENGTH:
                                return bcmolt_cli_xgpon_onu_oper_adjust_tx_wavelength_submit(device_id, session);
                            case BCMOLT_XGPON_ONU_OPER_ID_SECURE_MUTUAL_AUTHENTICATION:
                                return bcmolt_cli_xgpon_onu_oper_secure_mutual_authentication_submit(device_id, session, byte_pool);
                            case BCMOLT_XGPON_ONU_OPER_ID_ONU_TUNING_IN:
                                return bcmolt_cli_xgpon_onu_oper_onu_tuning_in_submit(device_id, session);
                            case BCMOLT_XGPON_ONU_OPER_ID_ONU_TUNING_OUT:
                                return bcmolt_cli_xgpon_onu_oper_onu_tuning_out_submit(device_id, session);
                            default:
                                return BCM_ERR_RANGE;
                        }
                    }

                case BCMOLT_MGT_GROUP_PROXY:
                    {
                        bcmolt_xgpon_onu_proxy_id sub;
                        cli_parm = bcmcli_find_named_parm(session, "sub");
                        if (cli_parm != NULL)
                        {
                            sub = (bcmolt_xgpon_onu_proxy_id) cli_parm->value.number;
                        }
                        else
                        {
                            apicli_print_complete(session, BCM_ERR_PARM, "sub is not set\n");
                            return BCM_ERR_PARM;
                        }

                        switch (sub)
                        {
                            case BCMOLT_XGPON_ONU_PROXY_ID_PLOAM_PACKET:
                                return bcmolt_cli_xgpon_onu_proxy_ploam_packet_send(device_id, session);
                            case BCMOLT_XGPON_ONU_PROXY_ID_CPU_PACKETS:
                                return bcmolt_cli_xgpon_onu_proxy_cpu_packets_send(device_id, session, byte_pool);
                            default:
                                return BCM_ERR_RANGE;
                        }
                    }

                default:
                    return BCM_ERR_RANGE;
            }

        case BCMOLT_OBJ_ID_XGPON_TRX:
            switch (group_type)
            {
                case BCMOLT_MGT_GROUP_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_xgpon_trx_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_xgpon_trx_cfg_set(device_id, session);
                        case BCMOLT_MSG_TYPE_CLEAR:
                            return bcmolt_cli_xgpon_trx_cfg_clear(device_id, session);
                        case BCMOLT_MSG_TYPE_GET_MULTI:
                            return bcmolt_cli_xgpon_trx_cfg_get_multi(device_id, session, byte_pool);
                        default:
                            return BCM_ERR_RANGE;
                    }

                default:
                    return BCM_ERR_RANGE;
            }

        case BCMOLT_OBJ_ID_XPON_SERDES:
            switch (group_type)
            {
                case BCMOLT_MGT_GROUP_CFG:
                    switch (msg_type)
                    {
                        case BCMOLT_MSG_TYPE_GET:
                            return bcmolt_cli_xpon_serdes_cfg_get(device_id, session);
                        case BCMOLT_MSG_TYPE_SET:
                            return bcmolt_cli_xpon_serdes_cfg_set(device_id, session);
                        case BCMOLT_MSG_TYPE_CLEAR:
                            return bcmolt_cli_xpon_serdes_cfg_clear(device_id, session);
                        case BCMOLT_MSG_TYPE_GET_MULTI:
                            return bcmolt_cli_xpon_serdes_cfg_get_multi(device_id, session, byte_pool);
                        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 bcmolt_cli_api_call(bcmolt_devid device_id, bcmolt_mgt_group group_type, bcmolt_msg_type msg_type, bcmcli_session *session)
{
    bcmos_errno err;
    apicli_byte_pool byte_pool;
    (void)apicli_unumber_to_ipv4;

    /* setup memory pool for dynamically-sized list memory allocation */
    err = apicli_byte_pool_create(&byte_pool);
    if (err != BCM_ERR_OK)
    {
        return err;
    }

    /* call the root API handler */
    err = bcmolt_cli_api_root(device_id, group_type, msg_type, session, &byte_pool);

    /* free all dynamically allocated memory */
    apicli_byte_pool_destroy(&byte_pool);

    return err;
}
