/*
<:copyright-BRCM:2016:proprietary:standard

   Broadcom Proprietary and Confidential.(c) 2016 Broadcom
   All Rights Reserved

This program is the proprietary software of Broadcom Corporation and/or its
licensors, and may only be used, duplicated, modified or distributed pursuant
to the terms and conditions of a separate, written license agreement executed
between you and Broadcom (an "Authorized License").  Except as set forth in
an Authorized License, Broadcom grants no license (express or implied), right
to use, or waiver of any kind with respect to the Software, and Broadcom
expressly reserves all rights in and to the Software and all intellectual
property rights therein.  IF YOU HAVE NO AUTHORIZED LICENSE, THEN YOU HAVE
NO RIGHT TO USE THIS SOFTWARE IN ANY WAY, AND SHOULD IMMEDIATELY NOTIFY
BROADCOM AND DISCONTINUE ALL USE OF THE SOFTWARE.

Except as expressly set forth in the Authorized License,

1. This program, including its structure, sequence and organization,
    constitutes the valuable trade secrets of Broadcom, and you shall use
    all reasonable efforts to protect the confidentiality thereof, and to
    use this information only in connection with your use of Broadcom
    integrated circuit products.

2. TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS"
    AND WITH ALL FAULTS AND BROADCOM MAKES NO PROMISES, REPRESENTATIONS OR
    WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH
    RESPECT TO THE SOFTWARE.  BROADCOM SPECIFICALLY DISCLAIMS ANY AND
    ALL IMPLIED WARRANTIES OF TITLE, MERCHANTABILITY, NONINFRINGEMENT,
    FITNESS FOR A PARTICULAR PURPOSE, LACK OF VIRUSES, ACCURACY OR
    COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION OR CORRESPONDENCE
    TO DESCRIPTION. YOU ASSUME THE ENTIRE RISK ARISING OUT OF USE OR
    PERFORMANCE OF THE SOFTWARE.

3. TO THE MAXIMUM EXTENT PERMITTED BY LAW, IN NO EVENT SHALL BROADCOM OR
    ITS LICENSORS BE LIABLE FOR (i) CONSEQUENTIAL, INCIDENTAL, SPECIAL,
    INDIRECT, OR EXEMPLARY DAMAGES WHATSOEVER ARISING OUT OF OR IN ANY
    WAY RELATING TO YOUR USE OF OR INABILITY TO USE THE SOFTWARE EVEN
    IF BROADCOM HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES;
    OR (ii) ANY AMOUNT IN EXCESS OF THE AMOUNT ACTUALLY PAID FOR THE
    SOFTWARE ITSELF OR U.S. $1, WHICHEVER IS GREATER. THESE LIMITATIONS
    SHALL APPLY NOTWITHSTANDING ANY FAILURE OF ESSENTIAL PURPOSE OF ANY
    LIMITED REMEDY.
:>
*/
#include "bcmolt_epon_oam_types.h"

#define bcmolt_epon_oam_buf_init(buf, size, start)  bcmolt_buf_init(buf, size, start, BCMOLT_BUF_ENDIAN_FIXED)
#define bcmolt_epon_oam_buf_skip                    bcmolt_buf_skip
#define bcmolt_epon_oam_buf_set_pos                 bcmolt_buf_set_pos
#define bcmolt_epon_oam_buf_get_used                bcmolt_buf_get_used
#define bcmolt_epon_oam_buf_get_remaining_size      bcmolt_buf_get_remaining_size
#define bcmolt_epon_oam_buf_write                   bcmolt_buf_write
#define bcmolt_epon_oam_buf_read                    bcmolt_buf_read
#define bcmolt_epon_oam_buf_write_u8                bcmolt_buf_write_u8
#define bcmolt_epon_oam_buf_read_u8                 bcmolt_buf_read_u8
#define bcmolt_epon_oam_buf_write_u16               bcmolt_buf_write_u16
#define bcmolt_epon_oam_buf_read_u16                bcmolt_buf_read_u16
#define bcmolt_epon_oam_buf_write_u24               bcmolt_buf_write_u24
#define bcmolt_epon_oam_buf_read_u24                bcmolt_buf_read_u24
#define bcmolt_epon_oam_buf_write_u32               bcmolt_buf_write_u32
#define bcmolt_epon_oam_buf_read_u32                bcmolt_buf_read_u32
#define bcmolt_epon_oam_buf_write_s32               bcmolt_buf_write_s32
#define bcmolt_epon_oam_buf_read_s32                bcmolt_buf_read_s32
#define bcmolt_epon_oam_buf_write_u64               bcmolt_buf_write_u64
#define bcmolt_epon_oam_buf_read_u64                bcmolt_buf_read_u64
#define bcmolt_epon_oam_buf_write_bool              bcmolt_buf_write_bool
#define bcmolt_epon_oam_buf_read_bool               bcmolt_buf_read_bool
#define bcmolt_epon_oam_buf_write_mac_address       bcmolt_buf_write_mac_address
#define bcmolt_epon_oam_buf_read_mac_address        bcmolt_buf_read_mac_address
#define bcmolt_epon_oam_buf_write_ipv4_address      bcmolt_buf_write_ipv4_address
#define bcmolt_epon_oam_buf_read_ipv4_address       bcmolt_buf_read_ipv4_address
#define bcmolt_epon_oam_buf_write_ipv6_address      bcmolt_buf_write_ipv6_address
#define bcmolt_epon_oam_buf_read_ipv6_address       bcmolt_buf_read_ipv6_address
#define bcmolt_epon_oam_buf_write_vlan_tag          bcmolt_buf_write_vlan_tag
#define bcmolt_epon_oam_buf_read_vlan_tag           bcmolt_buf_read_vlan_tag

static uint24_t uint32_t_to_uint24_t(uint32_t u32)
{
    uint24_t u24;

    u24.u8[0] = (u32 >> 16) & 0xff;
    u24.u8[1] = (u32 >> 8) & 0xff;
    u24.u8[2] = (u32 >> 0) & 0xff;

    return u24;
}

static uint32_t uint24_t_to_uint32_t(uint24_t u24)
{
    uint32_t u32 = 0;

    u32 |= u24.u8[0] << 16;
    u32 |= u24.u8[1] << 8;
    u32 |= u24.u8[2] << 0;

    return u32;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_alarm_config_mode_pack(bcmolt_epon_oam_alarm_config_mode this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_alarm_config_mode_unpack(bcmolt_epon_oam_alarm_config_mode *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_autonegotiate_admin_state_pack(bcmolt_epon_oam_autonegotiate_admin_state this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_autonegotiate_admin_state_unpack(bcmolt_epon_oam_autonegotiate_admin_state *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_auto_negotiation_auto_config_pack(bcmolt_epon_oam_auto_negotiation_auto_config this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_auto_negotiation_auto_config_unpack(bcmolt_epon_oam_auto_negotiation_auto_config *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_auto_negotiation_capability_pack(bcmolt_epon_oam_auto_negotiation_capability this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_auto_negotiation_capability_unpack(bcmolt_epon_oam_auto_negotiation_capability *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_auto_remote_sig_pack(bcmolt_epon_oam_auto_remote_sig this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_auto_remote_sig_unpack(bcmolt_epon_oam_auto_remote_sig *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_auto_selector_pack(bcmolt_epon_oam_auto_selector this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_auto_selector_unpack(bcmolt_epon_oam_auto_selector *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_binary_field_select_type_pack(bcmolt_epon_oam_binary_field_select_type this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_binary_field_select_type_unpack(bcmolt_epon_oam_binary_field_select_type *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cmc_request_option_pack(bcmolt_epon_oam_brcm_cmc_request_option this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cmc_request_option_unpack(bcmolt_epon_oam_brcm_cmc_request_option *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cmc_result_code_pack(bcmolt_epon_oam_brcm_cmc_result_code this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cmc_result_code_unpack(bcmolt_epon_oam_brcm_cmc_result_code *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cmc_annex_pack(bcmolt_epon_oam_brcm_cmc_annex this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cmc_annex_unpack(bcmolt_epon_oam_brcm_cmc_annex *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cmc_intf_type_pack(bcmolt_epon_oam_brcm_cmc_intf_type this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cmc_intf_type_unpack(bcmolt_epon_oam_brcm_cmc_intf_type *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cmc_interface_status_pack(bcmolt_epon_oam_brcm_cmc_interface_status this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cmc_interface_status_unpack(bcmolt_epon_oam_brcm_cmc_interface_status *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cmc_interleaver_pack(bcmolt_epon_oam_brcm_cmc_interleaver this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cmc_interleaver_unpack(bcmolt_epon_oam_brcm_cmc_interleaver *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cmc_load_balance_method_pack(bcmolt_epon_oam_brcm_cmc_load_balance_method this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cmc_load_balance_method_unpack(bcmolt_epon_oam_brcm_cmc_load_balance_method *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cmc_modulation_pack(bcmolt_epon_oam_brcm_cmc_modulation this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cmc_modulation_unpack(bcmolt_epon_oam_brcm_cmc_modulation *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cmc_us_modulation_type_pack(bcmolt_epon_oam_brcm_cmc_us_modulation_type this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cmc_us_modulation_type_unpack(bcmolt_epon_oam_brcm_cmc_us_modulation_type *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cmc_us_profile_type_pack(bcmolt_epon_oam_brcm_cmc_us_profile_type this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cmc_us_profile_type_unpack(bcmolt_epon_oam_brcm_cmc_us_profile_type *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cnu_connectivity_state_pack(bcmolt_epon_oam_brcm_cnu_connectivity_state this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cnu_connectivity_state_unpack(bcmolt_epon_oam_brcm_cnu_connectivity_state *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cnu_docsis_version_pack(bcmolt_epon_oam_brcm_cnu_docsis_version this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cnu_docsis_version_unpack(bcmolt_epon_oam_brcm_cnu_docsis_version *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cnu_ipaddr_type_pack(bcmolt_epon_oam_brcm_cnu_ipaddr_type this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cnu_ipaddr_type_unpack(bcmolt_epon_oam_brcm_cnu_ipaddr_type *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_oam_pdu_opcode_pack(bcmolt_epon_oam_brcm_oam_pdu_opcode this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_oam_pdu_opcode_unpack(bcmolt_epon_oam_brcm_oam_pdu_opcode *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_clock_transport_key_pack(bcmolt_epon_oam_clock_transport_key this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_clock_transport_key_unpack(bcmolt_epon_oam_clock_transport_key *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_var_leaf_action_pack(bcmolt_epon_oam_var_leaf_action this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_var_leaf_action_unpack(bcmolt_epon_oam_var_leaf_action *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_enabled_state_pack(bcmolt_epon_oam_ctc_enabled_state this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u32(buf, (uint32_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_enabled_state_unpack(bcmolt_epon_oam_ctc_enabled_state *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t num_val;
    if (!bcmolt_epon_oam_buf_read_u32(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_activation_pack(bcmolt_epon_oam_ctc_activation this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u32(buf, (uint32_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_activation_unpack(bcmolt_epon_oam_ctc_activation *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t num_val;
    if (!bcmolt_epon_oam_buf_read_u32(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_leaf_management_object_pack(bcmolt_epon_oam_ctc_leaf_management_object this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_leaf_management_object_unpack(bcmolt_epon_oam_ctc_leaf_management_object *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_onu_alarm_id_pack(bcmolt_epon_oam_ctc_onu_alarm_id this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_onu_alarm_id_unpack(bcmolt_epon_oam_ctc_onu_alarm_id *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_power_alarm_code_pack(bcmolt_epon_oam_ctc_power_alarm_code this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u32(buf, (uint32_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_power_alarm_code_unpack(bcmolt_epon_oam_ctc_power_alarm_code *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t num_val;
    if (!bcmolt_epon_oam_buf_read_u32(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_pon_if_switch_code_pack(bcmolt_epon_oam_ctc_pon_if_switch_code this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u32(buf, (uint32_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_pon_if_switch_code_unpack(bcmolt_epon_oam_ctc_pon_if_switch_code *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t num_val;
    if (!bcmolt_epon_oam_buf_read_u32(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_var_leaf_attribute_pack(bcmolt_epon_oam_var_leaf_attribute this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_var_leaf_attribute_unpack(bcmolt_epon_oam_var_leaf_attribute *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_fec_support_pack(bcmolt_epon_oam_ctc_fec_support this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u32(buf, (uint32_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_fec_support_unpack(bcmolt_epon_oam_ctc_fec_support *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t num_val;
    if (!bcmolt_epon_oam_buf_read_u32(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_fec_state_pack(bcmolt_epon_oam_ctc_fec_state this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u32(buf, (uint32_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_fec_state_unpack(bcmolt_epon_oam_ctc_fec_state *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t num_val;
    if (!bcmolt_epon_oam_buf_read_u32(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_churning_op_code_pack(bcmolt_epon_oam_ctc_churning_op_code this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_churning_op_code_unpack(bcmolt_epon_oam_ctc_churning_op_code *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_classification_operation_pack(bcmolt_epon_oam_ctc_classification_operation this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_classification_operation_unpack(bcmolt_epon_oam_ctc_classification_operation *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_commit_image_ack_pack(bcmolt_epon_oam_ctc_commit_image_ack this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_commit_image_ack_unpack(bcmolt_epon_oam_ctc_commit_image_ack *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_commit_image_opcode_pack(bcmolt_epon_oam_ctc_commit_image_opcode this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_commit_image_opcode_unpack(bcmolt_epon_oam_ctc_commit_image_opcode *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_commit_image_flag_pack(bcmolt_epon_oam_ctc_commit_image_flag this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_commit_image_flag_unpack(bcmolt_epon_oam_ctc_commit_image_flag *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_dba_op_code_pack(bcmolt_epon_oam_ctc_dba_op_code this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_dba_op_code_unpack(bcmolt_epon_oam_ctc_dba_op_code *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_early_wake_up_mode_pack(bcmolt_epon_oam_ctc_early_wake_up_mode this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_early_wake_up_mode_unpack(bcmolt_epon_oam_ctc_early_wake_up_mode *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_branch_pack(bcmolt_epon_oam_ctc_branch this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_branch_unpack(bcmolt_epon_oam_ctc_branch *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_error_code_pack(bcmolt_epon_oam_oam_error_code this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_error_code_unpack(bcmolt_epon_oam_oam_error_code *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_leaf_old_management_object_pack(bcmolt_epon_oam_ctc_leaf_old_management_object this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_leaf_old_management_object_unpack(bcmolt_epon_oam_ctc_leaf_old_management_object *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_port_type_pack(bcmolt_epon_oam_ctc_port_type this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_port_type_unpack(bcmolt_epon_oam_ctc_port_type *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_leaf_ext_attribute_pack(bcmolt_epon_oam_ctc_leaf_ext_attribute this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_leaf_ext_attribute_unpack(bcmolt_epon_oam_ctc_leaf_ext_attribute *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_leaf_ext_action_pack(bcmolt_epon_oam_ctc_leaf_ext_action this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_leaf_ext_action_unpack(bcmolt_epon_oam_ctc_leaf_ext_action *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ktleaf_attribute_pack(bcmolt_epon_oam_ktleaf_attribute this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ktleaf_attribute_unpack(bcmolt_epon_oam_ktleaf_attribute *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_eth_port_policing_enable_pack(bcmolt_epon_oam_ctc_eth_port_policing_enable this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_eth_port_policing_enable_unpack(bcmolt_epon_oam_ctc_eth_port_policing_enable *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_event_sub_type_pack(bcmolt_epon_oam_ctc_event_sub_type this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_event_sub_type_unpack(bcmolt_epon_oam_ctc_event_sub_type *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_event_status_pack(bcmolt_epon_oam_ctc_event_status this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u32(buf, (uint32_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_event_status_unpack(bcmolt_epon_oam_ctc_event_status *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t num_val;
    if (!bcmolt_epon_oam_buf_read_u32(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_onu_sleep_flag_pack(bcmolt_epon_oam_ctc_onu_sleep_flag this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_onu_sleep_flag_unpack(bcmolt_epon_oam_ctc_onu_sleep_flag *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_onu_sleep_mode_pack(bcmolt_epon_oam_ctc_onu_sleep_mode this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_onu_sleep_mode_unpack(bcmolt_epon_oam_ctc_onu_sleep_mode *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_pppo_etest_status_pack(bcmolt_epon_oam_pppo_etest_status this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_pppo_etest_status_unpack(bcmolt_epon_oam_pppo_etest_status *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_pppo_etest_fail_reason_pack(bcmolt_epon_oam_pppo_etest_fail_reason this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_pppo_etest_fail_reason_unpack(bcmolt_epon_oam_pppo_etest_fail_reason *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_start_or_stop_indication_pack(bcmolt_epon_oam_start_or_stop_indication this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_start_or_stop_indication_unpack(bcmolt_epon_oam_start_or_stop_indication *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_pppo_eauth_mode_pack(bcmolt_epon_oam_pppo_eauth_mode this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_pppo_eauth_mode_unpack(bcmolt_epon_oam_pppo_eauth_mode *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_supported_services_pack(bcmolt_epon_oam_ctc_supported_services this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_supported_services_unpack(bcmolt_epon_oam_ctc_supported_services *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_service_sla_operation_pack(bcmolt_epon_oam_ctc_service_sla_operation this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_service_sla_operation_unpack(bcmolt_epon_oam_ctc_service_sla_operation *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_onu_dba_scheduling_scheme_pack(bcmolt_epon_oam_ctc_onu_dba_scheduling_scheme this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_onu_dba_scheduling_scheme_unpack(bcmolt_epon_oam_ctc_onu_dba_scheduling_scheme *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_onu_type_pack(bcmolt_epon_oam_ctc_onu_type this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u32(buf, (uint32_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_onu_type_unpack(bcmolt_epon_oam_ctc_onu_type *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t num_val;
    if (!bcmolt_epon_oam_buf_read_u32(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_onu_protection_type_pack(bcmolt_epon_oam_ctc_onu_protection_type this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_onu_protection_type_unpack(bcmolt_epon_oam_ctc_onu_protection_type *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_onu_interface_type_pack(bcmolt_epon_oam_ctc_onu_interface_type this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u32(buf, (uint32_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_onu_interface_type_unpack(bcmolt_epon_oam_ctc_onu_interface_type *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t num_val;
    if (!bcmolt_epon_oam_buf_read_u32(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_mxu_global_params_width_pack(bcmolt_epon_oam_ctc_mxu_global_params_width this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_mxu_global_params_width_unpack(bcmolt_epon_oam_ctc_mxu_global_params_width *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_mxu_snmp_params_width_pack(bcmolt_epon_oam_ctc_mxu_snmp_params_width this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_mxu_snmp_params_width_unpack(bcmolt_epon_oam_ctc_mxu_snmp_params_width *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_onu_power_supply_control_type_pack(bcmolt_epon_oam_ctc_onu_power_supply_control_type this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_onu_power_supply_control_type_unpack(bcmolt_epon_oam_ctc_onu_power_supply_control_type *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_vlan_mode_pack(bcmolt_epon_oam_ctc_vlan_mode this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_vlan_mode_unpack(bcmolt_epon_oam_ctc_vlan_mode *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_onu_classif_field_pack(bcmolt_epon_oam_ctc_onu_classif_field this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_onu_classif_field_unpack(bcmolt_epon_oam_ctc_onu_classif_field *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_onu_classif_operator_pack(bcmolt_epon_oam_ctc_onu_classif_operator this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_onu_classif_operator_unpack(bcmolt_epon_oam_ctc_onu_classif_operator *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_multicast_vlan_operation_pack(bcmolt_epon_oam_ctc_multicast_vlan_operation this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_multicast_vlan_operation_unpack(bcmolt_epon_oam_ctc_multicast_vlan_operation *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_multicast_tag_mode_pack(bcmolt_epon_oam_ctc_multicast_tag_mode this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_multicast_tag_mode_unpack(bcmolt_epon_oam_ctc_multicast_tag_mode *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_multicast_switch_mode_pack(bcmolt_epon_oam_ctc_multicast_switch_mode this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_multicast_switch_mode_unpack(bcmolt_epon_oam_ctc_multicast_switch_mode *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_multicast_control_action_pack(bcmolt_epon_oam_ctc_multicast_control_action this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_multicast_control_action_unpack(bcmolt_epon_oam_ctc_multicast_control_action *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_multicast_control_type_pack(bcmolt_epon_oam_ctc_multicast_control_type this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_multicast_control_type_unpack(bcmolt_epon_oam_ctc_multicast_control_type *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_voip_protocol_pack(bcmolt_epon_oam_ctc_voip_protocol this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_voip_protocol_unpack(bcmolt_epon_oam_ctc_voip_protocol *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_voice_ipmode_pack(bcmolt_epon_oam_ctc_voice_ipmode this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_voice_ipmode_unpack(bcmolt_epon_oam_ctc_voice_ipmode *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_pppoe_mode_pack(bcmolt_epon_oam_ctc_pppoe_mode this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_pppoe_mode_unpack(bcmolt_epon_oam_ctc_pppoe_mode *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_voice_tagging_mode_pack(bcmolt_epon_oam_ctc_voice_tagging_mode this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_voice_tagging_mode_unpack(bcmolt_epon_oam_ctc_voice_tagging_mode *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_h248reg_mode_pack(bcmolt_epon_oam_ctc_h248reg_mode this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_h248reg_mode_unpack(bcmolt_epon_oam_ctc_h248reg_mode *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_h248heartbeat_mode_pack(bcmolt_epon_oam_ctc_h248heartbeat_mode this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_h248heartbeat_mode_unpack(bcmolt_epon_oam_ctc_h248heartbeat_mode *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_rtp_tid_mode_pack(bcmolt_epon_oam_ctc_rtp_tid_mode this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_rtp_tid_mode_unpack(bcmolt_epon_oam_ctc_rtp_tid_mode *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_voice_t38mode_pack(bcmolt_epon_oam_ctc_voice_t38mode this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_voice_t38mode_unpack(bcmolt_epon_oam_ctc_voice_t38mode *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_voice_fax_modem_control_mode_pack(bcmolt_epon_oam_ctc_voice_fax_modem_control_mode this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_voice_fax_modem_control_mode_unpack(bcmolt_epon_oam_ctc_voice_fax_modem_control_mode *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_iad_operation_status_pack(bcmolt_epon_oam_ctc_iad_operation_status this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u32(buf, (uint32_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_iad_operation_status_unpack(bcmolt_epon_oam_ctc_iad_operation_status *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t num_val;
    if (!bcmolt_epon_oam_buf_read_u32(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_iad_port_status_pack(bcmolt_epon_oam_ctc_iad_port_status this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u32(buf, (uint32_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_iad_port_status_unpack(bcmolt_epon_oam_ctc_iad_port_status *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t num_val;
    if (!bcmolt_epon_oam_buf_read_u32(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_iad_port_service_state_pack(bcmolt_epon_oam_ctc_iad_port_service_state this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u32(buf, (uint32_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_iad_port_service_state_unpack(bcmolt_epon_oam_ctc_iad_port_service_state *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t num_val;
    if (!bcmolt_epon_oam_buf_read_u32(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_iad_port_codec_mode_pack(bcmolt_epon_oam_ctc_iad_port_codec_mode this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u32(buf, (uint32_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_iad_port_codec_mode_unpack(bcmolt_epon_oam_ctc_iad_port_codec_mode *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t num_val;
    if (!bcmolt_epon_oam_buf_read_u32(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_iad_operation_pack(bcmolt_epon_oam_ctc_iad_operation this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u32(buf, (uint32_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_iad_operation_unpack(bcmolt_epon_oam_ctc_iad_operation *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t num_val;
    if (!bcmolt_epon_oam_buf_read_u32(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_zte_onu_port_mac_operation_pack(bcmolt_epon_oam_zte_onu_port_mac_operation this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_zte_onu_port_mac_operation_unpack(bcmolt_epon_oam_zte_onu_port_mac_operation *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_zte_isolate_mode_pack(bcmolt_epon_oam_zte_isolate_mode this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_zte_isolate_mode_unpack(bcmolt_epon_oam_zte_isolate_mode *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_zte_buffer_manage_mode_pack(bcmolt_epon_oam_zte_buffer_manage_mode this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_zte_buffer_manage_mode_unpack(bcmolt_epon_oam_zte_buffer_manage_mode *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_zte_dsbuf_direction_pack(bcmolt_epon_oam_zte_dsbuf_direction this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_zte_dsbuf_direction_unpack(bcmolt_epon_oam_zte_dsbuf_direction *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_zte_statistics_action_mode_pack(bcmolt_epon_oam_zte_statistics_action_mode this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_zte_statistics_action_mode_unpack(bcmolt_epon_oam_zte_statistics_action_mode *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_zte_statistics_reset_mode_pack(bcmolt_epon_oam_zte_statistics_reset_mode this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_zte_statistics_reset_mode_unpack(bcmolt_epon_oam_zte_statistics_reset_mode *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_uni_flow_statistics_collect_control_mode_pack(bcmolt_epon_oam_uni_flow_statistics_collect_control_mode this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_uni_flow_statistics_collect_control_mode_unpack(bcmolt_epon_oam_uni_flow_statistics_collect_control_mode *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_light_indication_mode_pack(bcmolt_epon_oam_light_indication_mode this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_light_indication_mode_unpack(bcmolt_epon_oam_light_indication_mode *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_match_mac_address_mode_pack(bcmolt_epon_oam_match_mac_address_mode this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_match_mac_address_mode_unpack(bcmolt_epon_oam_match_mac_address_mode *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_zte_light_control_action_mode_pack(bcmolt_epon_oam_zte_light_control_action_mode this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_zte_light_control_action_mode_unpack(bcmolt_epon_oam_zte_light_control_action_mode *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_onu_excl_ability_pack(bcmolt_epon_oam_onu_excl_ability this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_onu_excl_ability_unpack(bcmolt_epon_oam_onu_excl_ability *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_onu_early_wake_capability_pack(bcmolt_epon_oam_ctc_onu_early_wake_capability this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_onu_early_wake_capability_unpack(bcmolt_epon_oam_ctc_onu_early_wake_capability *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_port_disable_on_loop_detected_state_pack(bcmolt_epon_oam_ctc_port_disable_on_loop_detected_state this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u32(buf, (uint32_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_port_disable_on_loop_detected_state_unpack(bcmolt_epon_oam_ctc_port_disable_on_loop_detected_state *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t num_val;
    if (!bcmolt_epon_oam_buf_read_u32(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_monitoring_status_pack(bcmolt_epon_oam_ctc_monitoring_status this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_monitoring_status_unpack(bcmolt_epon_oam_ctc_monitoring_status *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_file_check_opcode_pack(bcmolt_epon_oam_ctc_file_check_opcode this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_file_check_opcode_unpack(bcmolt_epon_oam_ctc_file_check_opcode *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_rps_code_pack(bcmolt_epon_oam_ctc_rps_code this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_rps_code_unpack(bcmolt_epon_oam_ctc_rps_code *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_onu_auth_code_pack(bcmolt_epon_oam_ctc_onu_auth_code this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_onu_auth_code_unpack(bcmolt_epon_oam_ctc_onu_auth_code *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_well_known_oui_pack(bcmolt_epon_oam_well_known_oui this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u24(buf, uint32_t_to_uint24_t((uint32_t) this));
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_well_known_oui_unpack(bcmolt_epon_oam_well_known_oui *this, bcmolt_epon_oam_buf *buf)
{
    uint24_t num_val;
    if (!bcmolt_epon_oam_buf_read_u24(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = uint24_t_to_uint32_t(num_val);
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_rule_operator_pack(bcmolt_epon_oam_ctc_rule_operator this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_rule_operator_unpack(bcmolt_epon_oam_ctc_rule_operator *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_software_download_data_type_pack(bcmolt_epon_oam_ctc_software_download_data_type this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_software_download_data_type_unpack(bcmolt_epon_oam_ctc_software_download_data_type *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_tftp_op_code_pack(bcmolt_epon_oam_ctc_tftp_op_code this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_tftp_op_code_unpack(bcmolt_epon_oam_ctc_tftp_op_code *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_swmirror_opcode_pack(bcmolt_epon_oam_ctc_swmirror_opcode this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_swmirror_opcode_unpack(bcmolt_epon_oam_ctc_swmirror_opcode *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_swmirror_activate_image_flag_pack(bcmolt_epon_oam_ctc_swmirror_activate_image_flag this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_swmirror_activate_image_flag_unpack(bcmolt_epon_oam_ctc_swmirror_activate_image_flag *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_swmirror_ack_pack(bcmolt_epon_oam_ctc_swmirror_ack this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_swmirror_ack_unpack(bcmolt_epon_oam_ctc_swmirror_ack *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ktoptical_power_alarm_status_pack(bcmolt_epon_oam_ktoptical_power_alarm_status this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ktoptical_power_alarm_status_unpack(bcmolt_epon_oam_ktoptical_power_alarm_status *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ktleaf_action_pack(bcmolt_epon_oam_ktleaf_action this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ktleaf_action_unpack(bcmolt_epon_oam_ktleaf_action *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_opcode_pack(bcmolt_epon_oam_ctc_opcode this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_opcode_unpack(bcmolt_epon_oam_ctc_opcode *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ktonu_event_type_pack(bcmolt_epon_oam_ktonu_event_type this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ktonu_event_type_unpack(bcmolt_epon_oam_ktonu_event_type *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ktloop_detect_event_pack(bcmolt_epon_oam_ktloop_detect_event this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ktloop_detect_event_unpack(bcmolt_epon_oam_ktloop_detect_event *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ktoptical_power_alarm_event_pack(bcmolt_epon_oam_ktoptical_power_alarm_event this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ktoptical_power_alarm_event_unpack(bcmolt_epon_oam_ktoptical_power_alarm_event *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dasan_classifier_command_pack(bcmolt_epon_oam_dasan_classifier_command this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dasan_classifier_command_unpack(bcmolt_epon_oam_dasan_classifier_command *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dasan_direction_pack(bcmolt_epon_oam_dasan_direction this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u32(buf, (uint32_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dasan_direction_unpack(bcmolt_epon_oam_dasan_direction *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t num_val;
    if (!bcmolt_epon_oam_buf_read_u32(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dasan_filter_field_pack(bcmolt_epon_oam_dasan_filter_field this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u32(buf, (uint32_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dasan_filter_field_unpack(bcmolt_epon_oam_dasan_filter_field *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t num_val;
    if (!bcmolt_epon_oam_buf_read_u32(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dasan_filter_action_pack(bcmolt_epon_oam_dasan_filter_action this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u32(buf, (uint32_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dasan_filter_action_unpack(bcmolt_epon_oam_dasan_filter_action *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t num_val;
    if (!bcmolt_epon_oam_buf_read_u32(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dasan_pri_type_pack(bcmolt_epon_oam_dasan_pri_type this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u32(buf, (uint32_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dasan_pri_type_unpack(bcmolt_epon_oam_dasan_pri_type *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t num_val;
    if (!bcmolt_epon_oam_buf_read_u32(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dasan_opcode_pack(bcmolt_epon_oam_dasan_opcode this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dasan_opcode_unpack(bcmolt_epon_oam_dasan_opcode *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dasan_stats_seq_type_pack(bcmolt_epon_oam_dasan_stats_seq_type this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dasan_stats_seq_type_unpack(bcmolt_epon_oam_dasan_stats_seq_type *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dasan_stat_id_pack(bcmolt_epon_oam_dasan_stat_id this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dasan_stat_id_unpack(bcmolt_epon_oam_dasan_stat_id *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_direction_pack(bcmolt_epon_oam_direction this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_direction_unpack(bcmolt_epon_oam_direction *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_domain_option_pack(bcmolt_epon_oam_domain_option this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_domain_option_unpack(bcmolt_epon_oam_domain_option *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_leaf_action_pack(bcmolt_epon_oam_dpoe_leaf_action this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_leaf_action_unpack(bcmolt_epon_oam_dpoe_leaf_action *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_loopback_location_pack(bcmolt_epon_oam_dpoe_loopback_location this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_loopback_location_unpack(bcmolt_epon_oam_dpoe_loopback_location *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_llid_action_pack(bcmolt_epon_oam_dpoe_llid_action this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_llid_action_unpack(bcmolt_epon_oam_dpoe_llid_action *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_alarm_code_pack(bcmolt_epon_oam_dpoe_alarm_code this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_alarm_code_unpack(bcmolt_epon_oam_dpoe_alarm_code *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_leaf_attribute_pack(bcmolt_epon_oam_dpoe_leaf_attribute this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_leaf_attribute_unpack(bcmolt_epon_oam_dpoe_leaf_attribute *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_link_state_pack(bcmolt_epon_oam_dpoe_link_state this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_link_state_unpack(bcmolt_epon_oam_dpoe_link_state *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_learning_mode_pack(bcmolt_epon_oam_dpoe_learning_mode this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_learning_mode_unpack(bcmolt_epon_oam_dpoe_learning_mode *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_branch_pack(bcmolt_epon_oam_dpoe_branch this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_branch_unpack(bcmolt_epon_oam_dpoe_branch *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_object_type_pack(bcmolt_epon_oam_dpoe_object_type this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_object_type_unpack(bcmolt_epon_oam_dpoe_object_type *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_encryption_mode_pack(bcmolt_epon_oam_dpoe_encryption_mode this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_encryption_mode_unpack(bcmolt_epon_oam_dpoe_encryption_mode *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_rule_type_pack(bcmolt_epon_oam_rule_type this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_rule_type_unpack(bcmolt_epon_oam_rule_type *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_field_code_pack(bcmolt_epon_oam_dpoe_field_code this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_field_code_unpack(bcmolt_epon_oam_dpoe_field_code *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_rule_operator_pack(bcmolt_epon_oam_rule_operator this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_rule_operator_unpack(bcmolt_epon_oam_rule_operator *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_result_pack(bcmolt_epon_oam_dpoe_result this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_result_unpack(bcmolt_epon_oam_dpoe_result *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_layer_select_pack(bcmolt_epon_oam_dpoe_layer_select this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_layer_select_unpack(bcmolt_epon_oam_dpoe_layer_select *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_traffic_bitmap_pack(bcmolt_epon_oam_traffic_bitmap this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_traffic_bitmap_unpack(bcmolt_epon_oam_traffic_bitmap *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_rate_units_pack(bcmolt_epon_oam_rate_units this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_rate_units_unpack(bcmolt_epon_oam_rate_units *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_fec_mode_pack(bcmolt_epon_oam_dpoe_fec_mode this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_fec_mode_unpack(bcmolt_epon_oam_dpoe_fec_mode *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_port_type_pack(bcmolt_epon_oam_dpoe_port_type this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_port_type_unpack(bcmolt_epon_oam_dpoe_port_type *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_ipmc_forwarding_flags_pack(bcmolt_epon_oam_dpoe_ipmc_forwarding_flags this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_ipmc_forwarding_flags_unpack(bcmolt_epon_oam_dpoe_ipmc_forwarding_flags *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_power_saving_mode_pack(bcmolt_epon_oam_dpoe_power_saving_mode this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_power_saving_mode_unpack(bcmolt_epon_oam_dpoe_power_saving_mode *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_error_code_pack(bcmolt_epon_oam_dpoe_error_code this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_error_code_unpack(bcmolt_epon_oam_dpoe_error_code *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_file_transfer_opcode_pack(bcmolt_epon_oam_dpoe_file_transfer_opcode this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_file_transfer_opcode_unpack(bcmolt_epon_oam_dpoe_file_transfer_opcode *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_file_type_pack(bcmolt_epon_oam_dpoe_file_type this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_file_type_unpack(bcmolt_epon_oam_dpoe_file_type *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_file_transfer_error_pack(bcmolt_epon_oam_dpoe_file_transfer_error this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_file_transfer_error_unpack(bcmolt_epon_oam_dpoe_file_transfer_error *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_info_tlv_type_pack(bcmolt_epon_oam_dpoe_info_tlv_type this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_info_tlv_type_unpack(bcmolt_epon_oam_dpoe_info_tlv_type *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_mcast_ctrl_action_pack(bcmolt_epon_oam_dpoe_mcast_ctrl_action this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_mcast_ctrl_action_unpack(bcmolt_epon_oam_dpoe_mcast_ctrl_action *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_mcast_ctrl_resp_code_pack(bcmolt_epon_oam_dpoe_mcast_ctrl_resp_code this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_mcast_ctrl_resp_code_unpack(bcmolt_epon_oam_dpoe_mcast_ctrl_resp_code *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_mcast_reg_code_pack(bcmolt_epon_oam_dpoe_mcast_reg_code this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_mcast_reg_code_unpack(bcmolt_epon_oam_dpoe_mcast_reg_code *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_std_phy_type_pack(bcmolt_epon_oam_std_phy_type this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_std_phy_type_unpack(bcmolt_epon_oam_std_phy_type *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_state_pack(bcmolt_epon_oam_oam_state this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u32(buf, (uint32_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_state_unpack(bcmolt_epon_oam_oam_state *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t num_val;
    if (!bcmolt_epon_oam_buf_read_u32(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_mau_media_available_pack(bcmolt_epon_oam_mau_media_available this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_mau_media_available_unpack(bcmolt_epon_oam_mau_media_available *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_std_auto_negoitation_capability_pack(bcmolt_epon_oam_std_auto_negoitation_capability this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_std_auto_negoitation_capability_unpack(bcmolt_epon_oam_std_auto_negoitation_capability *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_mac_duplex_status_pack(bcmolt_epon_oam_mac_duplex_status this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_mac_duplex_status_unpack(bcmolt_epon_oam_mac_duplex_status *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_fec_support_pack(bcmolt_epon_oam_fec_support this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u32(buf, (uint32_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_fec_support_unpack(bcmolt_epon_oam_fec_support *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t num_val;
    if (!bcmolt_epon_oam_buf_read_u32(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_std_fec_mode_pack(bcmolt_epon_oam_std_fec_mode this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u32(buf, (uint32_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_std_fec_mode_unpack(bcmolt_epon_oam_std_fec_mode *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t num_val;
    if (!bcmolt_epon_oam_buf_read_u32(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_opcode_pack(bcmolt_epon_oam_dpoe_opcode this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_opcode_unpack(bcmolt_epon_oam_dpoe_opcode *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_version_pack(bcmolt_epon_oam_dpoe_version this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_version_unpack(bcmolt_epon_oam_dpoe_version *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_eap_code_pack(bcmolt_epon_oam_eap_code this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_eap_code_unpack(bcmolt_epon_oam_eap_code *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_subtype_pack(bcmolt_epon_oam_tls_subtype this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_subtype_unpack(bcmolt_epon_oam_tls_subtype *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_flags_pack(bcmolt_epon_oam_tls_flags this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_flags_unpack(bcmolt_epon_oam_tls_flags *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_content_type_pack(bcmolt_epon_oam_tls_content_type this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_content_type_unpack(bcmolt_epon_oam_tls_content_type *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_handshake_type_pack(bcmolt_epon_oam_tls_handshake_type this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_handshake_type_unpack(bcmolt_epon_oam_tls_handshake_type *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_ciphersuite_pack(bcmolt_epon_oam_tls_ciphersuite this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_ciphersuite_unpack(bcmolt_epon_oam_tls_ciphersuite *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_compression_method_pack(bcmolt_epon_oam_tls_compression_method this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_compression_method_unpack(bcmolt_epon_oam_tls_compression_method *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_certificate_type_pack(bcmolt_epon_oam_tls_certificate_type this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_certificate_type_unpack(bcmolt_epon_oam_tls_certificate_type *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_eapol_type_pack(bcmolt_epon_oam_eapol_type this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_eapol_type_unpack(bcmolt_epon_oam_eapol_type *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_eapol_version_pack(bcmolt_epon_oam_eapol_version this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_eapol_version_unpack(bcmolt_epon_oam_eapol_version *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_epoc_cmc_stat_index_pack(bcmolt_epon_oam_epoc_cmc_stat_index this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_epoc_cmc_stat_index_unpack(bcmolt_epon_oam_epoc_cmc_stat_index *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_epoc_cnu_stat_index_pack(bcmolt_epon_oam_epoc_cnu_stat_index this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_epoc_cnu_stat_index_unpack(bcmolt_epon_oam_epoc_cnu_stat_index *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_epoc_sdm250stat_index_pack(bcmolt_epon_oam_epoc_sdm250stat_index this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_epoc_sdm250stat_index_unpack(bcmolt_epon_oam_epoc_sdm250stat_index *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_epoc_stat_gather_modes_pack(bcmolt_epon_oam_epoc_stat_gather_modes this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_epoc_stat_gather_modes_unpack(bcmolt_epon_oam_epoc_stat_gather_modes *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_protocol_type_pack(bcmolt_epon_oam_protocol_type this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_protocol_type_unpack(bcmolt_epon_oam_protocol_type *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_slow_protocol_subtype_pack(bcmolt_epon_oam_slow_protocol_subtype this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_slow_protocol_subtype_unpack(bcmolt_epon_oam_slow_protocol_subtype *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_flags_pack(bcmolt_epon_oam_oam_flags this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_flags_unpack(bcmolt_epon_oam_oam_flags *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_opcode_pack(bcmolt_epon_oam_oam_opcode this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_opcode_unpack(bcmolt_epon_oam_oam_opcode *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_info_tlv_type_pack(bcmolt_epon_oam_info_tlv_type this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_info_tlv_type_unpack(bcmolt_epon_oam_info_tlv_type *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_info_tlv_type_pack(bcmolt_epon_oam_tek_info_tlv_type this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_info_tlv_type_unpack(bcmolt_epon_oam_tek_info_tlv_type *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_report_modes_pack(bcmolt_epon_oam_tek_report_modes this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_report_modes_unpack(bcmolt_epon_oam_tek_report_modes *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_local_remote_info_state_pack(bcmolt_epon_oam_local_remote_info_state this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_local_remote_info_state_unpack(bcmolt_epon_oam_local_remote_info_state *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_local_remote_info_config_pack(bcmolt_epon_oam_local_remote_info_config this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_local_remote_info_config_unpack(bcmolt_epon_oam_local_remote_info_config *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_link_event_type_pack(bcmolt_epon_oam_link_event_type this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_link_event_type_unpack(bcmolt_epon_oam_link_event_type *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_alarm_code_pack(bcmolt_epon_oam_tek_alarm_code this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_alarm_code_unpack(bcmolt_epon_oam_tek_alarm_code *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_alarm_context_pack(bcmolt_epon_oam_tek_alarm_context this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_alarm_context_unpack(bcmolt_epon_oam_tek_alarm_context *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_var_branch_pack(bcmolt_epon_oam_var_branch this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_var_branch_unpack(bcmolt_epon_oam_var_branch *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_var_leaf_object_pack(bcmolt_epon_oam_var_leaf_object this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_var_leaf_object_unpack(bcmolt_epon_oam_var_leaf_object *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_var_leaf_package_pack(bcmolt_epon_oam_var_leaf_package this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_var_leaf_package_unpack(bcmolt_epon_oam_var_leaf_package *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_var_leaf_name_binding_pack(bcmolt_epon_oam_var_leaf_name_binding this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_var_leaf_name_binding_unpack(bcmolt_epon_oam_var_leaf_name_binding *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_remote_loopback_command_pack(bcmolt_epon_oam_remote_loopback_command this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_remote_loopback_command_unpack(bcmolt_epon_oam_remote_loopback_command *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_opcode_pack(bcmolt_epon_oam_tek_opcode this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_opcode_unpack(bcmolt_epon_oam_tek_opcode *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_branch_pack(bcmolt_epon_oam_tek_branch this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_branch_unpack(bcmolt_epon_oam_tek_branch *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_object_type_pack(bcmolt_epon_oam_tek_object_type this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_object_type_unpack(bcmolt_epon_oam_tek_object_type *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_flow_direction_pack(bcmolt_epon_oam_flow_direction this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_flow_direction_unpack(bcmolt_epon_oam_flow_direction *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_leaf_attribute_pack(bcmolt_epon_oam_tek_leaf_attribute this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_leaf_attribute_unpack(bcmolt_epon_oam_tek_leaf_attribute *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_leaf_action_pack(bcmolt_epon_oam_tek_leaf_action this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_leaf_action_unpack(bcmolt_epon_oam_tek_leaf_action *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_onu_rule_flags_pack(bcmolt_epon_oam_tek_onu_rule_flags this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_onu_rule_flags_unpack(bcmolt_epon_oam_tek_onu_rule_flags *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_onu_rule_action_pack(bcmolt_epon_oam_tek_onu_rule_action this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_onu_rule_action_unpack(bcmolt_epon_oam_tek_onu_rule_action *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_onu_field_select_pack(bcmolt_epon_oam_tek_onu_field_select this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_onu_field_select_unpack(bcmolt_epon_oam_tek_onu_field_select *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_onu_rule_operator_pack(bcmolt_epon_oam_tek_onu_rule_operator this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_onu_rule_operator_unpack(bcmolt_epon_oam_tek_onu_rule_operator *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_onu_psstate_pack(bcmolt_epon_oam_onu_psstate this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_onu_psstate_unpack(bcmolt_epon_oam_onu_psstate *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_learn_table_mode_pack(bcmolt_epon_oam_tek_learn_table_mode this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_learn_table_mode_unpack(bcmolt_epon_oam_tek_learn_table_mode *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_vlan_destination_match_mode_pack(bcmolt_epon_oam_tek_vlan_destination_match_mode this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_vlan_destination_match_mode_unpack(bcmolt_epon_oam_tek_vlan_destination_match_mode *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_vlan_destination_flags_pack(bcmolt_epon_oam_tek_vlan_destination_flags this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_vlan_destination_flags_unpack(bcmolt_epon_oam_tek_vlan_destination_flags *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_encryption_mode_pack(bcmolt_epon_oam_tek_encryption_mode this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_encryption_mode_unpack(bcmolt_epon_oam_tek_encryption_mode *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_encryption_options_pack(bcmolt_epon_oam_tek_encryption_options this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_encryption_options_unpack(bcmolt_epon_oam_tek_encryption_options *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_rule_field_select_pack(bcmolt_epon_oam_rule_field_select this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_rule_field_select_unpack(bcmolt_epon_oam_rule_field_select *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_rule_action_pack(bcmolt_epon_oam_rule_action this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_rule_action_unpack(bcmolt_epon_oam_rule_action *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_maturity_pack(bcmolt_epon_oam_tek_maturity this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_maturity_unpack(bcmolt_epon_oam_tek_maturity *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_file_type_pack(bcmolt_epon_oam_file_type this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_file_type_unpack(bcmolt_epon_oam_file_type *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_nvs_state_pack(bcmolt_epon_oam_nvs_state this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_nvs_state_unpack(bcmolt_epon_oam_nvs_state *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_queue_config_v2subtype_pack(bcmolt_epon_oam_tek_queue_config_v2subtype this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_queue_config_v2subtype_unpack(bcmolt_epon_oam_tek_queue_config_v2subtype *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_report_mode_pack(bcmolt_epon_oam_tek_report_mode this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_report_mode_unpack(bcmolt_epon_oam_tek_report_mode *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_feature_set_pack(bcmolt_epon_oam_tek_feature_set this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_feature_set_unpack(bcmolt_epon_oam_tek_feature_set *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_mcast_snoop_mode_pack(bcmolt_epon_oam_mcast_snoop_mode this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_mcast_snoop_mode_unpack(bcmolt_epon_oam_mcast_snoop_mode *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ipmc_global_options_pack(bcmolt_epon_oam_ipmc_global_options this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ipmc_global_options_unpack(bcmolt_epon_oam_ipmc_global_options *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_forward_qualifier_pack(bcmolt_epon_oam_forward_qualifier this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_forward_qualifier_unpack(bcmolt_epon_oam_forward_qualifier *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_holdover_flags_pack(bcmolt_epon_oam_tek_holdover_flags this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_holdover_flags_unpack(bcmolt_epon_oam_tek_holdover_flags *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_mdi_mode_pack(bcmolt_epon_oam_mdi_mode this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_mdi_mode_unpack(bcmolt_epon_oam_mdi_mode *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_igmp_forwarding_qualifer_pack(bcmolt_epon_oam_tek_igmp_forwarding_qualifer this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_igmp_forwarding_qualifer_unpack(bcmolt_epon_oam_tek_igmp_forwarding_qualifer *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_igmp_snooping_options_pack(bcmolt_epon_oam_tek_igmp_snooping_options this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_igmp_snooping_options_unpack(bcmolt_epon_oam_tek_igmp_snooping_options *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_sleep_options_pack(bcmolt_epon_oam_sleep_options this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u32(buf, (uint32_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_sleep_options_unpack(bcmolt_epon_oam_sleep_options *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t num_val;
    if (!bcmolt_epon_oam_buf_read_u32(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ieee_register_flags_pack(bcmolt_epon_oam_ieee_register_flags this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ieee_register_flags_unpack(bcmolt_epon_oam_ieee_register_flags *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ieee_register_ack_flags_pack(bcmolt_epon_oam_ieee_register_ack_flags this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ieee_register_ack_flags_unpack(bcmolt_epon_oam_ieee_register_ack_flags *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_file_transfer_error_pack(bcmolt_epon_oam_tek_file_transfer_error this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_file_transfer_error_unpack(bcmolt_epon_oam_tek_file_transfer_error *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_file_type_pack(bcmolt_epon_oam_tek_file_type this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_file_type_unpack(bcmolt_epon_oam_tek_file_type *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_pmc_op_code_pack(bcmolt_epon_oam_pmc_op_code this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_pmc_op_code_unpack(bcmolt_epon_oam_pmc_op_code *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_pmc_file_op_pack(bcmolt_epon_oam_pmc_file_op this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_pmc_file_op_unpack(bcmolt_epon_oam_pmc_file_op *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_pmc_error_code_pack(bcmolt_epon_oam_pmc_error_code this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_pmc_error_code_unpack(bcmolt_epon_oam_pmc_error_code *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_onu_master_protocol_pack(bcmolt_epon_oam_onu_master_protocol this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_onu_master_protocol_unpack(bcmolt_epon_oam_onu_master_protocol *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_onu_master_ping_flags_pack(bcmolt_epon_oam_onu_master_ping_flags this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_onu_master_ping_flags_unpack(bcmolt_epon_oam_onu_master_ping_flags *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_master_end_point_type_pack(bcmolt_epon_oam_master_end_point_type this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_master_end_point_type_unpack(bcmolt_epon_oam_master_end_point_type *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_onu_master_communication_type_pack(bcmolt_epon_oam_onu_master_communication_type this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_onu_master_communication_type_unpack(bcmolt_epon_oam_onu_master_communication_type *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_onu_master_command_id_pack(bcmolt_epon_oam_onu_master_command_id this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_onu_master_command_id_unpack(bcmolt_epon_oam_onu_master_command_id *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_registration_action_pack(bcmolt_epon_oam_oam_registration_action this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_registration_action_unpack(bcmolt_epon_oam_oam_registration_action *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_info_type_pack(bcmolt_epon_oam_oam_reg_info_type this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_info_type_unpack(bcmolt_epon_oam_oam_reg_info_type *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_master_context_type_pack(bcmolt_epon_oam_master_context_type this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_master_context_type_unpack(bcmolt_epon_oam_master_context_type *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_version_pack(bcmolt_epon_oam_ctc_version this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_version_unpack(bcmolt_epon_oam_ctc_version *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_onu_master_response_code_pack(bcmolt_epon_oam_onu_master_response_code this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_onu_master_response_code_unpack(bcmolt_epon_oam_onu_master_response_code *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_onu_state_pack(bcmolt_epon_oam_onu_state this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_onu_state_unpack(bcmolt_epon_oam_onu_state *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_mdi_crossover_pack(bcmolt_epon_oam_mdi_crossover this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_mdi_crossover_unpack(bcmolt_epon_oam_mdi_crossover *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_sdm_stat_pack(bcmolt_epon_oam_sdm_stat this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_sdm_stat_unpack(bcmolt_epon_oam_sdm_stat *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_hash_algorithm_pack(bcmolt_epon_oam_tls_hash_algorithm this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_hash_algorithm_unpack(bcmolt_epon_oam_tls_hash_algorithm *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_signature_algorithm_pack(bcmolt_epon_oam_tls_signature_algorithm this, bcmolt_epon_oam_buf *buf)
{
    return bcmolt_epon_oam_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_signature_algorithm_unpack(bcmolt_epon_oam_tls_signature_algorithm *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_binary_entry_cvid_pack(bcmolt_epon_oam_binary_entry_cvid *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u16(buf, this->cvid))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_binary_entry_cvid_unpack(bcmolt_epon_oam_binary_entry_cvid *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->cvid))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_binary_entry_cvid_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 2);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_binary_entry_mac_pack(bcmolt_epon_oam_binary_entry_mac *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u16(buf, this->switching_domain))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_mac_address(buf, this->mac))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->link_id))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_binary_entry_mac_unpack(bcmolt_epon_oam_binary_entry_mac *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->switching_domain))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_mac_address(buf, &this->mac))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->link_id))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_binary_entry_mac_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 9);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_binary_entry_programmable_pack(bcmolt_epon_oam_binary_entry_programmable *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u32(buf, this->programmable_field0))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->programmable_field1))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_binary_entry_programmable_unpack(bcmolt_epon_oam_binary_entry_programmable *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->programmable_field0))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->programmable_field1))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_binary_entry_programmable_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 8);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_binary_entry_ssm_ip_pack(bcmolt_epon_oam_binary_entry_ssm_ip *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u16(buf, this->switching_domain))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->ssm_source_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_ipv4_address(buf, this->ipaddress))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_binary_entry_ssm_ip_unpack(bcmolt_epon_oam_binary_entry_ssm_ip *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->switching_domain))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->ssm_source_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_ipv4_address(buf, &this->ipaddress))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_binary_entry_ssm_ip_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 8);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_binary_entry_svlan_plus_cvlan_pack(bcmolt_epon_oam_binary_entry_svlan_plus_cvlan *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u16(buf, this->svid))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->cvid))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_binary_entry_svlan_plus_cvlan_unpack(bcmolt_epon_oam_binary_entry_svlan_plus_cvlan *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->svid))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->cvid))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_binary_entry_svlan_plus_cvlan_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 4);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_channel_option_pack(bcmolt_epon_oam_brcm_channel_option *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u8(buf, this->channel_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_brcm_cmc_request_option_pack(this->option_code, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_channel_option_unpack(bcmolt_epon_oam_brcm_channel_option *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->channel_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_brcm_cmc_request_option_unpack(&this->option_code, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_channel_option_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 2);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_channel_result_pack(bcmolt_epon_oam_brcm_channel_result *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u8(buf, this->channel_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_brcm_cmc_result_code_pack(this->result_code, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_channel_result_unpack(bcmolt_epon_oam_brcm_channel_result *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->channel_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_brcm_cmc_result_code_unpack(&this->result_code, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_channel_result_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 2);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cmc_classifier_config_data_pack(bcmolt_epon_oam_brcm_cmc_classifier_config_data *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u32(buf, this->svc_flow_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->classifier_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->direction))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->state))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->priority))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->iptos_low))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->iptos_high))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->iptos_mask))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->ipproto))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->ipaddr_type))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->ipsrc_addr_length))
    {
        return BCMOS_FALSE;
    }

    if ((this->ipsrc_addr_length > 0) && (this->ipsrc_addr == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"ipsrc_addr\" of struct \"bcmolt_epon_oam_brcm_cmc_classifier_config_data\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write(buf, this->ipsrc_addr, this->ipsrc_addr_length))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->ipsrc_mask_length))
    {
        return BCMOS_FALSE;
    }

    if ((this->ipsrc_mask_length > 0) && (this->ipsrc_mask == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"ipsrc_mask\" of struct \"bcmolt_epon_oam_brcm_cmc_classifier_config_data\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write(buf, this->ipsrc_mask, this->ipsrc_mask_length))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->ipdst_addr_length))
    {
        return BCMOS_FALSE;
    }

    if ((this->ipdst_addr_length > 0) && (this->ipdst_addr == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"ipdst_addr\" of struct \"bcmolt_epon_oam_brcm_cmc_classifier_config_data\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write(buf, this->ipdst_addr, this->ipdst_addr_length))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->ipdst_mask_length))
    {
        return BCMOS_FALSE;
    }

    if ((this->ipdst_mask_length > 0) && (this->ipdst_mask == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"ipdst_mask\" of struct \"bcmolt_epon_oam_brcm_cmc_classifier_config_data\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write(buf, this->ipdst_mask, this->ipdst_mask_length))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->src_port_start))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->src_port_end))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->dst_port_start))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->dst_port_end))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_mac_address(buf, this->dst_mac_addr))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_mac_address(buf, this->dst_mac_mask))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_mac_address(buf, this->src_mac_addr))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->l2proto_type))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->l2proto_value))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->user_priority_low))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->user_priority_high))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->vlan_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u24(buf, this->bitmap))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->flow_label))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->cmim))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->pkt_matches))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_brcm_cmc_classifier_config_data_get_packed_length(bcmolt_epon_oam_brcm_cmc_classifier_config_data *this)
{
    return 96 + this->ipsrc_addr_length + this->ipsrc_mask_length + this->ipdst_addr_length + this->ipdst_mask_length;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cmc_classifier_config_data_unpack(bcmolt_epon_oam_brcm_cmc_classifier_config_data *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->svc_flow_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->classifier_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->direction))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->state))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->priority))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->iptos_low))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->iptos_high))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->iptos_mask))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->ipproto))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->ipaddr_type))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->ipsrc_addr_length))
    {
        return BCMOS_FALSE;
    }

    if ((this->ipsrc_addr_length > 0) && (this->ipsrc_addr == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"ipsrc_addr\" of struct \"bcmolt_epon_oam_brcm_cmc_classifier_config_data\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->ipsrc_addr = (uint8_t *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->ipsrc_addr_length * sizeof(uint8_t));
        }
    }

    if (!bcmolt_epon_oam_buf_read(buf, this->ipsrc_addr, this->ipsrc_addr_length))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->ipsrc_mask_length))
    {
        return BCMOS_FALSE;
    }

    if ((this->ipsrc_mask_length > 0) && (this->ipsrc_mask == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"ipsrc_mask\" of struct \"bcmolt_epon_oam_brcm_cmc_classifier_config_data\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->ipsrc_mask = (uint8_t *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->ipsrc_mask_length * sizeof(uint8_t));
        }
    }

    if (!bcmolt_epon_oam_buf_read(buf, this->ipsrc_mask, this->ipsrc_mask_length))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->ipdst_addr_length))
    {
        return BCMOS_FALSE;
    }

    if ((this->ipdst_addr_length > 0) && (this->ipdst_addr == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"ipdst_addr\" of struct \"bcmolt_epon_oam_brcm_cmc_classifier_config_data\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->ipdst_addr = (uint8_t *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->ipdst_addr_length * sizeof(uint8_t));
        }
    }

    if (!bcmolt_epon_oam_buf_read(buf, this->ipdst_addr, this->ipdst_addr_length))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->ipdst_mask_length))
    {
        return BCMOS_FALSE;
    }

    if ((this->ipdst_mask_length > 0) && (this->ipdst_mask == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"ipdst_mask\" of struct \"bcmolt_epon_oam_brcm_cmc_classifier_config_data\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->ipdst_mask = (uint8_t *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->ipdst_mask_length * sizeof(uint8_t));
        }
    }

    if (!bcmolt_epon_oam_buf_read(buf, this->ipdst_mask, this->ipdst_mask_length))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->src_port_start))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->src_port_end))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->dst_port_start))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->dst_port_end))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_mac_address(buf, &this->dst_mac_addr))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_mac_address(buf, &this->dst_mac_mask))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_mac_address(buf, &this->src_mac_addr))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->l2proto_type))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->l2proto_value))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->user_priority_low))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->user_priority_high))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->vlan_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u24(buf, &this->bitmap))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->flow_label))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->cmim))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->pkt_matches))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cmc_classifier_config_data_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    uint8_t ipsrc_addr_length;
    uint8_t ipsrc_mask_length;
    uint8_t ipdst_addr_length;
    uint8_t ipdst_mask_length;
    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(packed, &ipsrc_addr_length))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * ipsrc_addr_length);
    if (!bcmolt_epon_oam_buf_skip(packed, ipsrc_addr_length * 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(packed, &ipsrc_mask_length))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * ipsrc_mask_length);
    if (!bcmolt_epon_oam_buf_skip(packed, ipsrc_mask_length * 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(packed, &ipdst_addr_length))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * ipdst_addr_length);
    if (!bcmolt_epon_oam_buf_skip(packed, ipdst_addr_length * 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(packed, &ipdst_mask_length))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * ipdst_mask_length);
    if (!bcmolt_epon_oam_buf_skip(packed, ipdst_mask_length * 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 6))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 6))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 6))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 3))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 8))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cmc_interface_data_pack(bcmolt_epon_oam_brcm_cmc_interface_data *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u16(buf, this->intf_index))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->intf_description_length))
    {
        return BCMOS_FALSE;
    }

    if ((this->intf_description_length > 0) && (this->intf_description == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"intf_description\" of struct \"bcmolt_epon_oam_brcm_cmc_interface_data\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write(buf, this->intf_description, this->intf_description_length))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_brcm_cmc_intf_type_pack(this->intf_type, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->intf_phy_addr_length))
    {
        return BCMOS_FALSE;
    }

    if ((this->intf_phy_addr_length > 0) && (this->intf_phy_addr == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"intf_phy_addr\" of struct \"bcmolt_epon_oam_brcm_cmc_interface_data\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write(buf, this->intf_phy_addr, this->intf_phy_addr_length))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->intf_alias_name_length))
    {
        return BCMOS_FALSE;
    }

    if ((this->intf_alias_name_length > 0) && (this->intf_alias_name == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"intf_alias_name\" of struct \"bcmolt_epon_oam_brcm_cmc_interface_data\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write(buf, this->intf_alias_name, this->intf_alias_name_length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_brcm_cmc_interface_data_get_packed_length(bcmolt_epon_oam_brcm_cmc_interface_data *this)
{
    return 6 + this->intf_description_length + this->intf_phy_addr_length + this->intf_alias_name_length;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cmc_interface_data_unpack(bcmolt_epon_oam_brcm_cmc_interface_data *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->intf_index))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->intf_description_length))
    {
        return BCMOS_FALSE;
    }

    if ((this->intf_description_length > 0) && (this->intf_description == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"intf_description\" of struct \"bcmolt_epon_oam_brcm_cmc_interface_data\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->intf_description = (uint8_t *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->intf_description_length * sizeof(uint8_t));
        }
    }

    if (!bcmolt_epon_oam_buf_read(buf, this->intf_description, this->intf_description_length))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_brcm_cmc_intf_type_unpack(&this->intf_type, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->intf_phy_addr_length))
    {
        return BCMOS_FALSE;
    }

    if ((this->intf_phy_addr_length > 0) && (this->intf_phy_addr == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"intf_phy_addr\" of struct \"bcmolt_epon_oam_brcm_cmc_interface_data\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->intf_phy_addr = (uint8_t *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->intf_phy_addr_length * sizeof(uint8_t));
        }
    }

    if (!bcmolt_epon_oam_buf_read(buf, this->intf_phy_addr, this->intf_phy_addr_length))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->intf_alias_name_length))
    {
        return BCMOS_FALSE;
    }

    if ((this->intf_alias_name_length > 0) && (this->intf_alias_name == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"intf_alias_name\" of struct \"bcmolt_epon_oam_brcm_cmc_interface_data\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->intf_alias_name = (uint8_t *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->intf_alias_name_length * sizeof(uint8_t));
        }
    }

    if (!bcmolt_epon_oam_buf_read(buf, this->intf_alias_name, this->intf_alias_name_length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cmc_interface_data_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    uint8_t intf_description_length;
    uint8_t intf_phy_addr_length;
    uint8_t intf_alias_name_length;
    if (!bcmolt_epon_oam_buf_skip(packed, 2))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(packed, &intf_description_length))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * intf_description_length);
    if (!bcmolt_epon_oam_buf_skip(packed, intf_description_length * 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(packed, &intf_phy_addr_length))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * intf_phy_addr_length);
    if (!bcmolt_epon_oam_buf_skip(packed, intf_phy_addr_length * 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(packed, &intf_alias_name_length))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * intf_alias_name_length);
    if (!bcmolt_epon_oam_buf_skip(packed, intf_alias_name_length * 1))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cmc_intf_stats_data_pack(bcmolt_epon_oam_brcm_cmc_intf_stats_data *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u16(buf, this->if_index))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->if_mtu))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->if_speed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_brcm_cmc_interface_status_pack(this->if_admin_status, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_brcm_cmc_interface_status_pack(this->if_oper_status, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->if_last_change))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->if_hcin_octets))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->if_hcin_ucast_pkts))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->if_hcin_multicast_pkts))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->if_hcin_broadcast_pkts))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->if_in_discards))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->if_in_errors))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->if_in_unknown_protos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->if_hcout_octets))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->if_hcout_ucast_pkts))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->if_hcout_multicast_pkts))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->if_hcout_broadcast_pkts))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->if_out_discards))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->if_out_errors))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->if_link_up_down_trap_enable))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->if_promiscuous_mode))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->if_connector_present))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->if_counter_discontinuity_time))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cmc_intf_stats_data_unpack(bcmolt_epon_oam_brcm_cmc_intf_stats_data *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->if_index))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->if_mtu))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->if_speed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_brcm_cmc_interface_status_unpack(&this->if_admin_status, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_brcm_cmc_interface_status_unpack(&this->if_oper_status, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->if_last_change))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->if_hcin_octets))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->if_hcin_ucast_pkts))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->if_hcin_multicast_pkts))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->if_hcin_broadcast_pkts))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->if_in_discards))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->if_in_errors))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->if_in_unknown_protos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->if_hcout_octets))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->if_hcout_ucast_pkts))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->if_hcout_multicast_pkts))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->if_hcout_broadcast_pkts))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->if_out_discards))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->if_out_errors))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->if_link_up_down_trap_enable))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->if_promiscuous_mode))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->if_connector_present))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->if_counter_discontinuity_time))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cmc_intf_stats_data_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 105);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cmc_sf_config_data_pack(bcmolt_epon_oam_brcm_cmc_sf_config_data *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u32(buf, this->svc_flow_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->sid))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->direction))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->flow_type))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->qos_type))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->channel_set_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u24(buf, this->dsid))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->max_requests_per_sid_cluster))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->max_bytes_per_sid_cluster))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->total_bytes_per_sid_cluster))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->max_time_per_sid_cluster))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->service_class_length))
    {
        return BCMOS_FALSE;
    }

    if ((this->service_class_length > 0) && (this->service_class == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"service_class\" of struct \"bcmolt_epon_oam_brcm_cmc_sf_config_data\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write(buf, this->service_class, this->service_class_length))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->priority))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->reseq_dsid_support))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->max_rate))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->max_burst))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->min_rate))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->min_pkt_size))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->active_timeout))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->admitted_timeout))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->max_concat_burst))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->scheduling_type))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->nom_poll_intvl))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->tol_poll_jitter))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->unsol_grant_size))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->nom_grant_intvl))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->tol_grant_jitter))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->tos_and_mask_length))
    {
        return BCMOS_FALSE;
    }

    if ((this->tos_and_mask_length > 0) && (this->tos_and_mask == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"tos_and_mask\" of struct \"bcmolt_epon_oam_brcm_cmc_sf_config_data\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write(buf, this->tos_and_mask, this->tos_and_mask_length))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->tos_or_mask_length))
    {
        return BCMOS_FALSE;
    }

    if ((this->tos_or_mask_length > 0) && (this->tos_or_mask == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"tos_or_mask\" of struct \"bcmolt_epon_oam_brcm_cmc_sf_config_data\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write(buf, this->tos_or_mask, this->tos_or_mask_length))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->max_latency))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->req_trans_policy_length))
    {
        return BCMOS_FALSE;
    }

    if ((this->req_trans_policy_length > 0) && (this->req_trans_policy == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"req_trans_policy\" of struct \"bcmolt_epon_oam_brcm_cmc_sf_config_data\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write(buf, this->req_trans_policy, this->req_trans_policy_length))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->bitmap))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->reqd_attrib_mask))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->forbid_attrib_mask))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->attrib_aggr_mask))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->attrib_mask_success))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->application_idlength))
    {
        return BCMOS_FALSE;
    }

    if ((this->application_idlength > 0) && (this->application_id == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"application_id\" of struct \"bcmolt_epon_oam_brcm_cmc_sf_config_data\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write(buf, this->application_id, this->application_idlength))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->cont_req_window_multi))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->bw_req_multi))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->peak_rate))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->create_time))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_brcm_cmc_sf_config_data_get_packed_length(bcmolt_epon_oam_brcm_cmc_sf_config_data *this)
{
    return 104 + this->service_class_length + this->tos_and_mask_length + this->tos_or_mask_length + this->req_trans_policy_length + this->application_idlength;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cmc_sf_config_data_unpack(bcmolt_epon_oam_brcm_cmc_sf_config_data *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->svc_flow_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->sid))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->direction))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->flow_type))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->qos_type))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->channel_set_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u24(buf, &this->dsid))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->max_requests_per_sid_cluster))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->max_bytes_per_sid_cluster))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->total_bytes_per_sid_cluster))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->max_time_per_sid_cluster))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->service_class_length))
    {
        return BCMOS_FALSE;
    }

    if ((this->service_class_length > 0) && (this->service_class == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"service_class\" of struct \"bcmolt_epon_oam_brcm_cmc_sf_config_data\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->service_class = (uint8_t *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->service_class_length * sizeof(uint8_t));
        }
    }

    if (!bcmolt_epon_oam_buf_read(buf, this->service_class, this->service_class_length))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->priority))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->reseq_dsid_support))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->max_rate))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->max_burst))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->min_rate))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->min_pkt_size))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->active_timeout))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->admitted_timeout))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->max_concat_burst))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->scheduling_type))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->nom_poll_intvl))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->tol_poll_jitter))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->unsol_grant_size))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->nom_grant_intvl))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->tol_grant_jitter))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->tos_and_mask_length))
    {
        return BCMOS_FALSE;
    }

    if ((this->tos_and_mask_length > 0) && (this->tos_and_mask == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"tos_and_mask\" of struct \"bcmolt_epon_oam_brcm_cmc_sf_config_data\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->tos_and_mask = (uint8_t *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->tos_and_mask_length * sizeof(uint8_t));
        }
    }

    if (!bcmolt_epon_oam_buf_read(buf, this->tos_and_mask, this->tos_and_mask_length))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->tos_or_mask_length))
    {
        return BCMOS_FALSE;
    }

    if ((this->tos_or_mask_length > 0) && (this->tos_or_mask == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"tos_or_mask\" of struct \"bcmolt_epon_oam_brcm_cmc_sf_config_data\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->tos_or_mask = (uint8_t *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->tos_or_mask_length * sizeof(uint8_t));
        }
    }

    if (!bcmolt_epon_oam_buf_read(buf, this->tos_or_mask, this->tos_or_mask_length))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->max_latency))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->req_trans_policy_length))
    {
        return BCMOS_FALSE;
    }

    if ((this->req_trans_policy_length > 0) && (this->req_trans_policy == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"req_trans_policy\" of struct \"bcmolt_epon_oam_brcm_cmc_sf_config_data\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->req_trans_policy = (uint8_t *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->req_trans_policy_length * sizeof(uint8_t));
        }
    }

    if (!bcmolt_epon_oam_buf_read(buf, this->req_trans_policy, this->req_trans_policy_length))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->bitmap))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->reqd_attrib_mask))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->forbid_attrib_mask))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->attrib_aggr_mask))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->attrib_mask_success))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->application_idlength))
    {
        return BCMOS_FALSE;
    }

    if ((this->application_idlength > 0) && (this->application_id == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"application_id\" of struct \"bcmolt_epon_oam_brcm_cmc_sf_config_data\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->application_id = (uint8_t *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->application_idlength * sizeof(uint8_t));
        }
    }

    if (!bcmolt_epon_oam_buf_read(buf, this->application_id, this->application_idlength))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->cont_req_window_multi))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->bw_req_multi))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->peak_rate))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->create_time))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cmc_sf_config_data_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    uint8_t service_class_length;
    uint8_t tos_and_mask_length;
    uint8_t tos_or_mask_length;
    uint8_t req_trans_policy_length;
    uint8_t application_idlength;
    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 2))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 3))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 2))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(packed, &service_class_length))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * service_class_length);
    if (!bcmolt_epon_oam_buf_skip(packed, service_class_length * 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 2))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 2))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 2))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 2))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 2))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(packed, &tos_and_mask_length))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * tos_and_mask_length);
    if (!bcmolt_epon_oam_buf_skip(packed, tos_and_mask_length * 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(packed, &tos_or_mask_length))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * tos_or_mask_length);
    if (!bcmolt_epon_oam_buf_skip(packed, tos_or_mask_length * 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(packed, &req_trans_policy_length))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * req_trans_policy_length);
    if (!bcmolt_epon_oam_buf_skip(packed, req_trans_policy_length * 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(packed, &application_idlength))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * application_idlength);
    if (!bcmolt_epon_oam_buf_skip(packed, application_idlength * 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cmc_sf_stats_data_pack(bcmolt_epon_oam_brcm_cmc_sf_stats_data *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u32(buf, this->svc_flow_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->total_pkt_count))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->total_byte_count))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->active_time))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->invalid_phs_count))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->pkts_dropped))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->pkts_delayed))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cmc_sf_stats_data_unpack(bcmolt_epon_oam_brcm_cmc_sf_stats_data *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->svc_flow_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->total_pkt_count))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->total_byte_count))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->active_time))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->invalid_phs_count))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->pkts_dropped))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->pkts_delayed))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cmc_sf_stats_data_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 36);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cnu_mac_addr_range_pack(bcmolt_epon_oam_brcm_cnu_mac_addr_range *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_mac_address(buf, this->cnu_mac_address_start))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_mac_address(buf, this->cnu_mac_address_end))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cnu_mac_addr_range_unpack(bcmolt_epon_oam_brcm_cnu_mac_addr_range *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_mac_address(buf, &this->cnu_mac_address_start))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_mac_address(buf, &this->cnu_mac_address_end))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cnu_mac_addr_range_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 12);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cnu_us_chan_data_pack(bcmolt_epon_oam_brcm_cnu_us_chan_data *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u8(buf, this->channel_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->power_level))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->high_res_timing_offset))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->equalization_data_length))
    {
        return BCMOS_FALSE;
    }

    if ((this->equalization_data_length > 0) && (this->equalization_data == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"equalization_data\" of struct \"bcmolt_epon_oam_brcm_cnu_us_chan_data\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write(buf, this->equalization_data, this->equalization_data_length))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->unerroreds))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->correcteds))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->uncorrectables))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->snr))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->micro_reflections))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_brcm_cnu_us_chan_data_get_packed_length(bcmolt_epon_oam_brcm_cnu_us_chan_data *this)
{
    return 37 + this->equalization_data_length;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cnu_us_chan_data_unpack(bcmolt_epon_oam_brcm_cnu_us_chan_data *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->channel_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->power_level))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->high_res_timing_offset))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->equalization_data_length))
    {
        return BCMOS_FALSE;
    }

    if ((this->equalization_data_length > 0) && (this->equalization_data == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"equalization_data\" of struct \"bcmolt_epon_oam_brcm_cnu_us_chan_data\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->equalization_data = (uint8_t *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->equalization_data_length * sizeof(uint8_t));
        }
    }

    if (!bcmolt_epon_oam_buf_read(buf, this->equalization_data, this->equalization_data_length))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->unerroreds))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->correcteds))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->uncorrectables))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->snr))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->micro_reflections))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cnu_us_chan_data_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    uint8_t equalization_data_length;
    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 2))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(packed, &equalization_data_length))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * equalization_data_length);
    if (!bcmolt_epon_oam_buf_skip(packed, equalization_data_length * 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 8))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 8))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 8))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cnu_status_data_pack(bcmolt_epon_oam_brcm_cnu_status_data *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t i0;
    uint8_t i1;
    if (!bcmolt_epon_oam_buf_write_u32(buf, this->idx))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_mac_address(buf, this->mac_address))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->uschan_count))
    {
        return BCMOS_FALSE;
    }

    if ((this->uschan_count > 0) && (this->uschan_data == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"uschan_data\" of struct \"bcmolt_epon_oam_brcm_cnu_status_data\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->uschan_count; i0++)
    {
        if (!bcmolt_epon_oam_brcm_cnu_us_chan_data_pack(&this->uschan_data[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    if (!bcmolt_epon_oam_brcm_cnu_connectivity_state_pack(this->connectivity_state, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_brcm_cnu_docsis_version_pack(this->docsis_version, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_brcm_cnu_ipaddr_type_pack(this->ipaddr_type, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->ipaddr_length))
    {
        return BCMOS_FALSE;
    }

    if ((this->ipaddr_length > 0) && (this->ipaddr_value == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"ipaddr_value\" of struct \"bcmolt_epon_oam_brcm_cnu_status_data\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write(buf, this->ipaddr_value, this->ipaddr_length))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->timestamp))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->sflow_count))
    {
        return BCMOS_FALSE;
    }

    if ((this->sflow_count > 0) && (this->sflow_id == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"sflow_id\" of struct \"bcmolt_epon_oam_brcm_cnu_status_data\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    for (i1 = 0; i1 < this->sflow_count; i1++)
    {
        if (!bcmolt_epon_oam_buf_write_u32(buf, this->sflow_id[i1]))
        {
            return BCMOS_FALSE;
        }
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->link_local_addr_length))
    {
        return BCMOS_FALSE;
    }

    if ((this->link_local_addr_length > 0) && (this->link_local_addr == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"link_local_addr\" of struct \"bcmolt_epon_oam_brcm_cnu_status_data\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write(buf, this->link_local_addr, this->link_local_addr_length))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->mac_domain_index))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->service_group_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->rcp_idlength))
    {
        return BCMOS_FALSE;
    }

    if ((this->rcp_idlength > 0) && (this->rcp_id == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"rcp_id\" of struct \"bcmolt_epon_oam_brcm_cnu_status_data\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write(buf, this->rcp_id, this->rcp_idlength))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->rcc_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->rcs_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->tcs_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->last_register_time))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->addr_resolve_requests))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_brcm_cnu_status_data_get_packed_length(bcmolt_epon_oam_brcm_cnu_status_data *this)
{
    uint32_t count = (48 + this->ipaddr_length) + (4 * this->sflow_count) + this->link_local_addr_length + this->rcp_idlength;
    uint32_t i0;
    if ((this->uschan_count > 0) && (this->uschan_data == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"uschan_count\" of struct \"bcmolt_epon_oam_brcm_cnu_status_data\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return 0;
    }

    for (i0 = 0; i0 < this->uschan_count; i0++)
    {
        count += bcmolt_epon_oam_brcm_cnu_us_chan_data_get_packed_length(&this->uschan_data[i0]);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cnu_status_data_unpack(bcmolt_epon_oam_brcm_cnu_status_data *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint8_t i0;
    uint8_t i1;
    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->idx))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_mac_address(buf, &this->mac_address))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->uschan_count))
    {
        return BCMOS_FALSE;
    }

    if ((this->uschan_count > 0) && (this->uschan_data == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"uschan_data\" of struct \"bcmolt_epon_oam_brcm_cnu_status_data\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->uschan_data = (bcmolt_epon_oam_brcm_cnu_us_chan_data *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->uschan_count * sizeof(bcmolt_epon_oam_brcm_cnu_us_chan_data));
        }
    }

    for (i0 = 0; i0 < this->uschan_count; i0++)
    {
        if (!bcmolt_epon_oam_brcm_cnu_us_chan_data_unpack(&this->uschan_data[i0], buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if (!bcmolt_epon_oam_brcm_cnu_connectivity_state_unpack(&this->connectivity_state, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_brcm_cnu_docsis_version_unpack(&this->docsis_version, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_brcm_cnu_ipaddr_type_unpack(&this->ipaddr_type, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->ipaddr_length))
    {
        return BCMOS_FALSE;
    }

    if ((this->ipaddr_length > 0) && (this->ipaddr_value == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"ipaddr_value\" of struct \"bcmolt_epon_oam_brcm_cnu_status_data\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->ipaddr_value = (uint8_t *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->ipaddr_length * sizeof(uint8_t));
        }
    }

    if (!bcmolt_epon_oam_buf_read(buf, this->ipaddr_value, this->ipaddr_length))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->timestamp))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->sflow_count))
    {
        return BCMOS_FALSE;
    }

    if ((this->sflow_count > 0) && (this->sflow_id == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"sflow_id\" of struct \"bcmolt_epon_oam_brcm_cnu_status_data\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->sflow_id = (uint32_t *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->sflow_count * sizeof(uint32_t));
        }
    }

    for (i1 = 0; i1 < this->sflow_count; i1++)
    {
        if (!bcmolt_epon_oam_buf_read_u32(buf, &this->sflow_id[i1]))
        {
            return BCMOS_FALSE;
        }
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->link_local_addr_length))
    {
        return BCMOS_FALSE;
    }

    if ((this->link_local_addr_length > 0) && (this->link_local_addr == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"link_local_addr\" of struct \"bcmolt_epon_oam_brcm_cnu_status_data\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->link_local_addr = (uint8_t *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->link_local_addr_length * sizeof(uint8_t));
        }
    }

    if (!bcmolt_epon_oam_buf_read(buf, this->link_local_addr, this->link_local_addr_length))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->mac_domain_index))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->service_group_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->rcp_idlength))
    {
        return BCMOS_FALSE;
    }

    if ((this->rcp_idlength > 0) && (this->rcp_id == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"rcp_id\" of struct \"bcmolt_epon_oam_brcm_cnu_status_data\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->rcp_id = (uint8_t *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->rcp_idlength * sizeof(uint8_t));
        }
    }

    if (!bcmolt_epon_oam_buf_read(buf, this->rcp_id, this->rcp_idlength))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->rcc_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->rcs_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->tcs_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->last_register_time))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->addr_resolve_requests))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_cnu_status_data_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    uint8_t uschan_count;
    uint8_t i0;
    uint8_t ipaddr_length;
    uint8_t sflow_count;
    uint8_t link_local_addr_length;
    uint8_t rcp_idlength;
    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 6))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(packed, &uschan_count))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_brcm_cnu_us_chan_data) * uschan_count);
    for (i0 = 0; i0 < uschan_count; i0++)
    {
        if (!bcmolt_epon_oam_brcm_cnu_us_chan_data_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(packed, &ipaddr_length))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * ipaddr_length);
    if (!bcmolt_epon_oam_buf_skip(packed, ipaddr_length * 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(packed, &sflow_count))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint32_t) * sflow_count);
    if (!bcmolt_epon_oam_buf_skip(packed, sflow_count * 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(packed, &link_local_addr_length))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * link_local_addr_length);
    if (!bcmolt_epon_oam_buf_skip(packed, link_local_addr_length * 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 2))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(packed, &rcp_idlength))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * rcp_idlength);
    if (!bcmolt_epon_oam_buf_skip(packed, rcp_idlength * 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_downstream_channel_properties_pack(bcmolt_epon_oam_brcm_downstream_channel_properties *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u8(buf, this->channel_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_bool(buf, this->is_enabled))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->center_frequency))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_brcm_cmc_modulation_pack(this->modulation, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_brcm_cmc_annex_pack(this->annex, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_brcm_cmc_interleaver_pack(this->interleaver, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->power_level))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->interface_index))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_downstream_channel_properties_unpack(bcmolt_epon_oam_brcm_downstream_channel_properties *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->channel_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_bool(buf, &this->is_enabled))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->center_frequency))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_brcm_cmc_modulation_unpack(&this->modulation, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_brcm_cmc_annex_unpack(&this->annex, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_brcm_cmc_interleaver_unpack(&this->interleaver, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->power_level))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->interface_index))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_downstream_channel_properties_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 13);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_upstream_channel_properties_pack(bcmolt_epon_oam_brcm_upstream_channel_properties *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u8(buf, this->channel_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_bool(buf, this->is_enabled))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->center_frequency))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->channel_width))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_brcm_cmc_us_profile_type_pack(this->channel_profile_type, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_bool(buf, this->is_sac2sinc2enabled))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->minislot_size))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->transmit_timing_offset))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->initial_ranging_backoff))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->final_ranging_backoff))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->initial_data_backoff))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->final_data_backoff))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->active_scdma_codes))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->codes_per_slot))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->scdma_frame_size))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->hopping_seed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_brcm_cmc_us_modulation_type_pack(this->modulation_type, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->pre_equalization_setting))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->interface_index))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_upstream_channel_properties_unpack(bcmolt_epon_oam_brcm_upstream_channel_properties *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->channel_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_bool(buf, &this->is_enabled))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->center_frequency))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->channel_width))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_brcm_cmc_us_profile_type_unpack(&this->channel_profile_type, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_bool(buf, &this->is_sac2sinc2enabled))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->minislot_size))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->transmit_timing_offset))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->initial_ranging_backoff))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->final_ranging_backoff))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->initial_data_backoff))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->final_data_backoff))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->active_scdma_codes))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->codes_per_slot))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->scdma_frame_size))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->hopping_seed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_brcm_cmc_us_modulation_type_unpack(&this->modulation_type, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->pre_equalization_setting))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->interface_index))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_upstream_channel_properties_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 33);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_upstream_signal_quality_pack(bcmolt_epon_oam_brcm_upstream_signal_quality *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u16(buf, this->interface_index))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->contention_intervals))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->unerroreds))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->correcteds))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->uncorrectables))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->snr))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->micro_reflections))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_upstream_signal_quality_unpack(bcmolt_epon_oam_brcm_upstream_signal_quality *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->interface_index))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->contention_intervals))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->unerroreds))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->correcteds))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->uncorrectables))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->snr))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->micro_reflections))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_upstream_signal_quality_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 32);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_upstream_channel_power_pack(bcmolt_epon_oam_brcm_upstream_channel_power *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u8(buf, this->channel_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->input_power_level))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_upstream_channel_power_unpack(bcmolt_epon_oam_brcm_upstream_channel_power *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->channel_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->input_power_level))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_upstream_channel_power_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 3);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_oam_pdu_base_pack(bcmolt_epon_oam_brcm_oam_pdu_base *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u8(buf, this->version))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->packet_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_brcm_oam_pdu_opcode_pack(this->opcode, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->opcode)
    {
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_DOWNSTREAM_CONFIG_REQUEST:
            {
                uint8_t i0;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.set_downstream_config_request.downstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.set_downstream_config_request.downstream_channels_count > 0) && (this->u.set_downstream_config_request.downstream_channels == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"downstream_channels\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_set_downstream_config_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i0 = 0; i0 < this->u.set_downstream_config_request.downstream_channels_count; i0++)
                {
                    if (!bcmolt_epon_oam_brcm_downstream_channel_properties_pack(&this->u.set_downstream_config_request.downstream_channels[i0], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_DOWNSTREAM_CONFIG_RESPONSE:
            {
                uint8_t i1;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.set_downstream_config_response.downstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.set_downstream_config_response.downstream_channels_count > 0) && (this->u.set_downstream_config_response.downstream_channels == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"downstream_channels\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_set_downstream_config_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i1 = 0; i1 < this->u.set_downstream_config_response.downstream_channels_count; i1++)
                {
                    if (!bcmolt_epon_oam_brcm_channel_result_pack(&this->u.set_downstream_config_response.downstream_channels[i1], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_DOWNSTREAM_CONFIG_REQUEST:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.get_downstream_config_request.downstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_downstream_config_request.downstream_channels_count > 0) && (this->u.get_downstream_config_request.downstream_channels == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"downstream_channels\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_get_downstream_config_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.get_downstream_config_request.downstream_channels, this->u.get_downstream_config_request.downstream_channels_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_DOWNSTREAM_CONFIG_RESPONSE:
            {
                uint8_t i2;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.get_downstream_config_response.downstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_downstream_config_response.downstream_channels_count > 0) && (this->u.get_downstream_config_response.downstream_channels == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"downstream_channels\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_get_downstream_config_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i2 = 0; i2 < this->u.get_downstream_config_response.downstream_channels_count; i2++)
                {
                    if (!bcmolt_epon_oam_brcm_downstream_channel_properties_pack(&this->u.get_downstream_config_response.downstream_channels[i2], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_UPSTREAM_CONFIG_REQUEST:
            {
                uint8_t i3;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.set_upstream_config_request.upstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.set_upstream_config_request.upstream_channels_count > 0) && (this->u.set_upstream_config_request.upstream_channels == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"upstream_channels\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_set_upstream_config_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i3 = 0; i3 < this->u.set_upstream_config_request.upstream_channels_count; i3++)
                {
                    if (!bcmolt_epon_oam_brcm_upstream_channel_properties_pack(&this->u.set_upstream_config_request.upstream_channels[i3], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_UPSTREAM_CONFIG_RESPONSE:
            {
                uint8_t i4;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.set_upstream_config_response.upstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.set_upstream_config_response.upstream_channels_count > 0) && (this->u.set_upstream_config_response.upstream_channels == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"upstream_channels\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_set_upstream_config_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i4 = 0; i4 < this->u.set_upstream_config_response.upstream_channels_count; i4++)
                {
                    if (!bcmolt_epon_oam_brcm_channel_result_pack(&this->u.set_upstream_config_response.upstream_channels[i4], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_UPSTREAM_CONFIG_REQUEST:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.get_upstream_config_request.upstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_upstream_config_request.upstream_channels_count > 0) && (this->u.get_upstream_config_request.upstream_channels == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"upstream_channels\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_get_upstream_config_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.get_upstream_config_request.upstream_channels, this->u.get_upstream_config_request.upstream_channels_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_UPSTREAM_CONFIG_RESPONSE:
            {
                uint8_t i5;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.get_upstream_config_response.upstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_upstream_config_response.upstream_channels_count > 0) && (this->u.get_upstream_config_response.upstream_channels == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"upstream_channels\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_get_upstream_config_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i5 = 0; i5 < this->u.get_upstream_config_response.upstream_channels_count; i5++)
                {
                    if (!bcmolt_epon_oam_brcm_upstream_channel_properties_pack(&this->u.get_upstream_config_response.upstream_channels[i5], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_CREATE_LOAD_BALANCING_GROUP_REQUEST:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.set_create_load_balancing_group_request.group_id))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_brcm_cmc_load_balance_method_pack(this->u.set_create_load_balancing_group_request.method, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_brcm_cmc_request_option_pack(this->u.set_create_load_balancing_group_request.request_option, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_CREATE_LOAD_BALANCING_GROUP_RESPONSE:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.set_create_load_balancing_group_response.group_id))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_brcm_cmc_result_code_pack(this->u.set_create_load_balancing_group_response.result_code, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_ADD_DOWNSTREAMS_TO_LOAD_BALANCING_GROUP_REQUEST:
            {
                uint8_t i6;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.set_add_downstreams_to_load_balancing_group_request.group_id))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.set_add_downstreams_to_load_balancing_group_request.downstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.set_add_downstreams_to_load_balancing_group_request.downstream_channels_count > 0) && (this->u.set_add_downstreams_to_load_balancing_group_request.downstream_channels == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"downstream_channels\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_set_add_downstreams_to_load_balancing_group_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i6 = 0; i6 < this->u.set_add_downstreams_to_load_balancing_group_request.downstream_channels_count; i6++)
                {
                    if (!bcmolt_epon_oam_brcm_channel_option_pack(&this->u.set_add_downstreams_to_load_balancing_group_request.downstream_channels[i6], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_ADD_DOWNSTREAMS_TO_LOAD_BALANCING_GROUP_RESPONSE:
            {
                uint8_t i7;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.set_add_downstreams_to_load_balancing_group_response.group_id))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.set_add_downstreams_to_load_balancing_group_response.downstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.set_add_downstreams_to_load_balancing_group_response.downstream_channels_count > 0) && (this->u.set_add_downstreams_to_load_balancing_group_response.downstream_channels == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"downstream_channels\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_set_add_downstreams_to_load_balancing_group_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i7 = 0; i7 < this->u.set_add_downstreams_to_load_balancing_group_response.downstream_channels_count; i7++)
                {
                    if (!bcmolt_epon_oam_brcm_channel_result_pack(&this->u.set_add_downstreams_to_load_balancing_group_response.downstream_channels[i7], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_ADD_UPSTREAMS_TO_LOAD_BALANCING_GROUP_REQUEST:
            {
                uint8_t i8;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.set_add_upstreams_to_load_balancing_group_request.group_id))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.set_add_upstreams_to_load_balancing_group_request.upstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.set_add_upstreams_to_load_balancing_group_request.upstream_channels_count > 0) && (this->u.set_add_upstreams_to_load_balancing_group_request.upstream_channels == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"upstream_channels\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_set_add_upstreams_to_load_balancing_group_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i8 = 0; i8 < this->u.set_add_upstreams_to_load_balancing_group_request.upstream_channels_count; i8++)
                {
                    if (!bcmolt_epon_oam_brcm_channel_option_pack(&this->u.set_add_upstreams_to_load_balancing_group_request.upstream_channels[i8], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_ADD_UPSTREAMS_TO_LOAD_BALANCING_GROUP_RESPONSE:
            {
                uint8_t i9;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.set_add_upstreams_to_load_balancing_group_response.group_id))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.set_add_upstreams_to_load_balancing_group_response.upstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.set_add_upstreams_to_load_balancing_group_response.upstream_channels_count > 0) && (this->u.set_add_upstreams_to_load_balancing_group_response.upstream_channels == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"upstream_channels\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_set_add_upstreams_to_load_balancing_group_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i9 = 0; i9 < this->u.set_add_upstreams_to_load_balancing_group_response.upstream_channels_count; i9++)
                {
                    if (!bcmolt_epon_oam_brcm_channel_result_pack(&this->u.set_add_upstreams_to_load_balancing_group_response.upstream_channels[i9], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_SIGNAL_QUALITY_REQUEST:
            {
                uint8_t i10;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.get_signal_quality_request.upstream_interfaces_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_signal_quality_request.upstream_interfaces_count > 0) && (this->u.get_signal_quality_request.upstream_interfaces == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"upstream_interfaces\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_get_signal_quality_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i10 = 0; i10 < this->u.get_signal_quality_request.upstream_interfaces_count; i10++)
                {
                    if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.get_signal_quality_request.upstream_interfaces[i10]))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_SIGNAL_QUALITY_RESPONSE:
            {
                uint8_t i11;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.get_signal_quality_response.upstream_interfaces_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_signal_quality_response.upstream_interfaces_count > 0) && (this->u.get_signal_quality_response.upstream_interfaces == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"upstream_interfaces\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_get_signal_quality_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i11 = 0; i11 < this->u.get_signal_quality_response.upstream_interfaces_count; i11++)
                {
                    if (!bcmolt_epon_oam_brcm_upstream_signal_quality_pack(&this->u.get_signal_quality_response.upstream_interfaces[i11], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_CNU_STATUS_REQUEST:
            {
                uint16_t i12;
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.get_cnu_status_request.cnu_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_cnu_status_request.cnu_count > 0) && (this->u.get_cnu_status_request.cnu_mac_address == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"cnu_mac_address\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_get_cnu_status_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i12 = 0; i12 < this->u.get_cnu_status_request.cnu_count; i12++)
                {
                    if (!bcmolt_epon_oam_buf_write_mac_address(buf, this->u.get_cnu_status_request.cnu_mac_address[i12]))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_CNU_STATUS_RESPONSE:
            {
                uint16_t i13;
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.get_cnu_status_response.cnu_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_cnu_status_response.cnu_count > 0) && (this->u.get_cnu_status_response.cnu_status_data == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"cnu_status_data\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_get_cnu_status_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i13 = 0; i13 < this->u.get_cnu_status_response.cnu_count; i13++)
                {
                    if (!bcmolt_epon_oam_brcm_cnu_status_data_pack(&this->u.get_cnu_status_response.cnu_status_data[i13], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_QOS_SERVICE_FLOW_STATISTICS_REQUEST:
            {
                uint8_t i14;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.get_qos_service_flow_statistics_request.svc_flow_idcount))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_qos_service_flow_statistics_request.svc_flow_idcount > 0) && (this->u.get_qos_service_flow_statistics_request.svc_flow_ids == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"svc_flow_ids\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_get_qos_service_flow_statistics_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i14 = 0; i14 < this->u.get_qos_service_flow_statistics_request.svc_flow_idcount; i14++)
                {
                    if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.get_qos_service_flow_statistics_request.svc_flow_ids[i14]))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_QOS_SERVICE_FLOW_STATISTICS_RESPONSE:
            {
                uint8_t i15;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.get_qos_service_flow_statistics_response.svc_flow_idcount))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_qos_service_flow_statistics_response.svc_flow_idcount > 0) && (this->u.get_qos_service_flow_statistics_response.svc_flow_data == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"svc_flow_data\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_get_qos_service_flow_statistics_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i15 = 0; i15 < this->u.get_qos_service_flow_statistics_response.svc_flow_idcount; i15++)
                {
                    if (!bcmolt_epon_oam_brcm_cmc_sf_stats_data_pack(&this->u.get_qos_service_flow_statistics_response.svc_flow_data[i15], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_CMC_INTERFACES_REQUEST:
            {
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_CMC_INTERFACES_RESPONSE:
            {
                uint16_t i16;
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.get_cmc_interfaces_response.intf_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.get_cmc_interfaces_response.timestamp))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_cmc_interfaces_response.intf_count > 0) && (this->u.get_cmc_interfaces_response.cmc_interface_data == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"cmc_interface_data\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_get_cmc_interfaces_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i16 = 0; i16 < this->u.get_cmc_interfaces_response.intf_count; i16++)
                {
                    if (!bcmolt_epon_oam_brcm_cmc_interface_data_pack(&this->u.get_cmc_interfaces_response.cmc_interface_data[i16], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_CMC_MAC_STATISTICS_REQUEST:
            {
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_CMC_MAC_STATISTICS_RESPONSE:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.get_cmc_mac_statistics_response.interface_index))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.get_cmc_mac_statistics_response.invalid_rng_reqs))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.get_cmc_mac_statistics_response.rng_aborts))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.get_cmc_mac_statistics_response.invalid_reg_reqs))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.get_cmc_mac_statistics_response.failed_reg_reqs))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.get_cmc_mac_statistics_response.invalid_data_reqs))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.get_cmc_mac_statistics_response.t5timeouts))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_CMC_INTERFACES_STATISTICS_REQUEST:
            {
                uint8_t i17;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.get_cmc_interfaces_statistics_request.intf_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_cmc_interfaces_statistics_request.intf_count > 0) && (this->u.get_cmc_interfaces_statistics_request.intf_index == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"intf_index\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_get_cmc_interfaces_statistics_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i17 = 0; i17 < this->u.get_cmc_interfaces_statistics_request.intf_count; i17++)
                {
                    if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.get_cmc_interfaces_statistics_request.intf_index[i17]))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_CMC_INTERFACES_STATISTICS_RESPONSE:
            {
                uint8_t i18;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.get_cmc_interfaces_statistics_response.interfaces_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_cmc_interfaces_statistics_response.interfaces_count > 0) && (this->u.get_cmc_interfaces_statistics_response.network_interfaces == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"network_interfaces\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_get_cmc_interfaces_statistics_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i18 = 0; i18 < this->u.get_cmc_interfaces_statistics_response.interfaces_count; i18++)
                {
                    if (!bcmolt_epon_oam_brcm_cmc_intf_stats_data_pack(&this->u.get_cmc_interfaces_statistics_response.network_interfaces[i18], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_QOS_SERVICE_FLOW_CONFIG_REQUEST:
            {
                uint8_t i19;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.get_qos_service_flow_config_request.svc_flow_idcount))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_qos_service_flow_config_request.svc_flow_idcount > 0) && (this->u.get_qos_service_flow_config_request.svc_flow_ids == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"svc_flow_ids\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_get_qos_service_flow_config_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i19 = 0; i19 < this->u.get_qos_service_flow_config_request.svc_flow_idcount; i19++)
                {
                    if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.get_qos_service_flow_config_request.svc_flow_ids[i19]))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_QOS_SERVICE_FLOW_CONFIG_RESPONSE:
            {
                uint8_t i20;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.get_qos_service_flow_config_response.svc_flow_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_qos_service_flow_config_response.svc_flow_count > 0) && (this->u.get_qos_service_flow_config_response.svc_flow_data == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"svc_flow_data\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_get_qos_service_flow_config_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i20 = 0; i20 < this->u.get_qos_service_flow_config_response.svc_flow_count; i20++)
                {
                    if (!bcmolt_epon_oam_brcm_cmc_sf_config_data_pack(&this->u.get_qos_service_flow_config_response.svc_flow_data[i20], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_QOS_PACKET_CLASSIFIER_CONFIG_REQUEST:
            {
                uint8_t i21;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.get_qos_packet_classifier_config_request.svc_flow_idcount))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_qos_packet_classifier_config_request.svc_flow_idcount > 0) && (this->u.get_qos_packet_classifier_config_request.svc_flow_ids == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"svc_flow_ids\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_get_qos_packet_classifier_config_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i21 = 0; i21 < this->u.get_qos_packet_classifier_config_request.svc_flow_idcount; i21++)
                {
                    if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.get_qos_packet_classifier_config_request.svc_flow_ids[i21]))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_QOS_PACKET_CLASSIFIER_CONFIG_RESPONSE:
            {
                uint8_t i22;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.get_qos_packet_classifier_config_response.classifier_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_qos_packet_classifier_config_response.classifier_count > 0) && (this->u.get_qos_packet_classifier_config_response.classifier_data == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"classifier_data\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_get_qos_packet_classifier_config_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i22 = 0; i22 < this->u.get_qos_packet_classifier_config_response.classifier_count; i22++)
                {
                    if (!bcmolt_epon_oam_brcm_cmc_classifier_config_data_pack(&this->u.get_qos_packet_classifier_config_response.classifier_data[i22], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_UPSTREAM_INPUT_POWER_REQUEST:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.get_upstream_input_power_request.upstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_upstream_input_power_request.upstream_channels_count > 0) && (this->u.get_upstream_input_power_request.upstream_channels == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"upstream_channels\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_get_upstream_input_power_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.get_upstream_input_power_request.upstream_channels, this->u.get_upstream_input_power_request.upstream_channels_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_UPSTREAM_INPUT_POWER_RESPONSE:
            {
                uint8_t i23;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.get_upstream_input_power_response.upstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_upstream_input_power_response.upstream_channels_count > 0) && (this->u.get_upstream_input_power_response.upstream_channels == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"upstream_channels\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_get_upstream_input_power_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i23 = 0; i23 < this->u.get_upstream_input_power_response.upstream_channels_count; i23++)
                {
                    if (!bcmolt_epon_oam_brcm_upstream_channel_power_pack(&this->u.get_upstream_input_power_response.upstream_channels[i23], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_UPSTREAM_INPUT_POWER_REQUEST:
            {
                uint8_t i24;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.set_upstream_input_power_request.upstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.set_upstream_input_power_request.upstream_channels_count > 0) && (this->u.set_upstream_input_power_request.upstream_channels == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"upstream_channels\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_set_upstream_input_power_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i24 = 0; i24 < this->u.set_upstream_input_power_request.upstream_channels_count; i24++)
                {
                    if (!bcmolt_epon_oam_brcm_upstream_channel_power_pack(&this->u.set_upstream_input_power_request.upstream_channels[i24], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_UPSTREAM_INPUT_POWER_RESPONSE:
            {
                if (!bcmolt_epon_oam_brcm_cmc_result_code_pack(this->u.set_upstream_input_power_response.result_code, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.set_upstream_input_power_response.channel_one_power))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.set_upstream_input_power_response.channel_two_power))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.set_upstream_input_power_response.channel_three_power))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.set_upstream_input_power_response.channel_four_power))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_ADD_CNUS_TO_LOAD_BALANCING_GROUP_REQUEST:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.set_add_cnus_to_load_balancing_group_request.group_id))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_brcm_cmc_request_option_pack(this->u.set_add_cnus_to_load_balancing_group_request.request_option, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_brcm_cnu_mac_addr_range_pack(&this->u.set_add_cnus_to_load_balancing_group_request.cnu_mac_range, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_ADD_CNUS_TO_LOAD_BALANCING_GROUP_RESPONSE:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.set_add_cnus_to_load_balancing_group_response.group_id))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_brcm_cmc_result_code_pack(this->u.set_add_cnus_to_load_balancing_group_response.result_code, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_EXCLUDE_CNUS_FROM_LOAD_BALANCING_REQUEST:
            {
                if (!bcmolt_epon_oam_brcm_cmc_request_option_pack(this->u.set_exclude_cnus_from_load_balancing_request.request_option, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_mac_address(buf, this->u.set_exclude_cnus_from_load_balancing_request.cnu_mac_address_start))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_mac_address(buf, this->u.set_exclude_cnus_from_load_balancing_request.cnu_mac_address_end))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_EXCLUDE_CNUS_FROM_LOAD_BALANCING_RESPONSE:
            {
                if (!bcmolt_epon_oam_brcm_cmc_result_code_pack(this->u.set_exclude_cnus_from_load_balancing_response.result_code, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_FULL_LOAD_BALANCING_GROUP_REQUEST:
            {
                uint8_t i25;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.set_full_load_balancing_group_request.group_id))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_brcm_cmc_load_balance_method_pack(this->u.set_full_load_balancing_group_request.method, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.set_full_load_balancing_group_request.downstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.set_full_load_balancing_group_request.downstream_channels_count > 0) && (this->u.set_full_load_balancing_group_request.downstream_channels == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"downstream_channels\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_set_full_load_balancing_group_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.set_full_load_balancing_group_request.downstream_channels, this->u.set_full_load_balancing_group_request.downstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.set_full_load_balancing_group_request.upstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.set_full_load_balancing_group_request.upstream_channels_count > 0) && (this->u.set_full_load_balancing_group_request.upstream_channels == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"upstream_channels\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_set_full_load_balancing_group_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.set_full_load_balancing_group_request.upstream_channels, this->u.set_full_load_balancing_group_request.upstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.set_full_load_balancing_group_request.restrictions_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.set_full_load_balancing_group_request.restrictions_count > 0) && (this->u.set_full_load_balancing_group_request.restrictions == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"restrictions\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_set_full_load_balancing_group_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i25 = 0; i25 < this->u.set_full_load_balancing_group_request.restrictions_count; i25++)
                {
                    if (!bcmolt_epon_oam_brcm_cnu_mac_addr_range_pack(&this->u.set_full_load_balancing_group_request.restrictions[i25], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_FULL_LOAD_BALANCING_GROUP_RESPONSE:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.set_full_load_balancing_group_response.group_id))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_brcm_cmc_result_code_pack(this->u.set_full_load_balancing_group_response.result_code, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_CMC_SYSTEM_EVENT_MESSAGE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_DOWNSTREAM_BONDING_GROUP_STATUS_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_DOWNSTREAM_BONDING_GROUP_STATUS_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_EXCLUDED_ACTIVE_CNUS_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_EXCLUDED_ACTIVE_CNUS_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_EXCLUDED_CNU_CONFIGURATION_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_EXCLUDED_CNUS_CONFIGURATION_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_FULL_LOAD_BALANCING_GROUP_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_FULL_LOAD_BALANCING_GROUP_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_LOAD_BALANCING_GROUP_ACTIVE_CNUS_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_LOAD_BALANCING_GROUP_ACTIVE_CNUS_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_LOAD_BALANCING_GROUP_CNU_CONFIGURATION_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_LOAD_BALANCING_GROUP_CNU_CONFIGURATION_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_LOAD_BALANCING_GROUP_DOWNSTREAMS_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_LOAD_BALANCING_GROUP_DOWNSTREAMS_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_LOAD_BALANCING_GROUP_UPSTREAMS_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_LOAD_BALANCING_GROUP_UPSTREAMS_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_LOAD_BALANCING_GROUPS_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_LOAD_BALANCING_GROUPS_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_MAX_UPSTREAM_RFATTENUATION_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_MAX_UPSTREAM_RFATTENUATION_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_MOVE_CNU_DOWNSTREAM_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_MOVE_CNU_DOWNSTREAM_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_MOVE_CNU_UPSTREAM_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_MOVE_CNU_UPSTREAM_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_SERVICES_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_SERVICES_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_UPSTREAM_BONDING_GROUP_STATUS_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_UPSTREAM_BONDING_GROUP_STATUS_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_REG_RSP_EVENT_MESSAGE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_MAX_UPSTREAM_RFATTENUATION_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_MAX_UPSTREAM_RFATTENUATION_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_MOVE_CNU_DOWNSTREAM_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_MOVE_CNU_DOWNSTREAM_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_MOVE_CNU_UPSTREAM_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_MOVE_CNU_UPSTREAM_RESPONSE:
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_brcm_oam_pdu_base_get_packed_length(bcmolt_epon_oam_brcm_oam_pdu_base *this)
{
    uint32_t count = 5;
    switch (this->opcode)
    {
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_DOWNSTREAM_CONFIG_REQUEST:
            {
                count += 1 + (13 * this->u.set_downstream_config_request.downstream_channels_count);
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_DOWNSTREAM_CONFIG_RESPONSE:
            {
                count += 1 + (2 * this->u.set_downstream_config_response.downstream_channels_count);
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_DOWNSTREAM_CONFIG_REQUEST:
            {
                count += 1 + this->u.get_downstream_config_request.downstream_channels_count;
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_DOWNSTREAM_CONFIG_RESPONSE:
            {
                count += 1 + (13 * this->u.get_downstream_config_response.downstream_channels_count);
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_UPSTREAM_CONFIG_REQUEST:
            {
                count += 1 + (33 * this->u.set_upstream_config_request.upstream_channels_count);
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_UPSTREAM_CONFIG_RESPONSE:
            {
                count += 1 + (2 * this->u.set_upstream_config_response.upstream_channels_count);
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_UPSTREAM_CONFIG_REQUEST:
            {
                count += 1 + this->u.get_upstream_config_request.upstream_channels_count;
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_UPSTREAM_CONFIG_RESPONSE:
            {
                count += 1 + (33 * this->u.get_upstream_config_response.upstream_channels_count);
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_CREATE_LOAD_BALANCING_GROUP_REQUEST:
            {
                count += 3;
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_CREATE_LOAD_BALANCING_GROUP_RESPONSE:
            {
                count += 2;
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_ADD_DOWNSTREAMS_TO_LOAD_BALANCING_GROUP_REQUEST:
            {
                count += 2 + (2 * this->u.set_add_downstreams_to_load_balancing_group_request.downstream_channels_count);
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_ADD_DOWNSTREAMS_TO_LOAD_BALANCING_GROUP_RESPONSE:
            {
                count += 2 + (2 * this->u.set_add_downstreams_to_load_balancing_group_response.downstream_channels_count);
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_ADD_UPSTREAMS_TO_LOAD_BALANCING_GROUP_REQUEST:
            {
                count += 2 + (2 * this->u.set_add_upstreams_to_load_balancing_group_request.upstream_channels_count);
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_ADD_UPSTREAMS_TO_LOAD_BALANCING_GROUP_RESPONSE:
            {
                count += 2 + (2 * this->u.set_add_upstreams_to_load_balancing_group_response.upstream_channels_count);
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_SIGNAL_QUALITY_REQUEST:
            {
                count += 1 + (2 * this->u.get_signal_quality_request.upstream_interfaces_count);
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_SIGNAL_QUALITY_RESPONSE:
            {
                count += 1 + (32 * this->u.get_signal_quality_response.upstream_interfaces_count);
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_CNU_STATUS_REQUEST:
            {
                count += 2 + (6 * this->u.get_cnu_status_request.cnu_count);
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_CNU_STATUS_RESPONSE:
            {
                uint32_t i0;
                count += 2;
                if ((this->u.get_cnu_status_response.cnu_count > 0) && (this->u.get_cnu_status_response.cnu_status_data == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"cnu_count\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return 0;
                }

                for (i0 = 0; i0 < this->u.get_cnu_status_response.cnu_count; i0++)
                {
                    count += bcmolt_epon_oam_brcm_cnu_status_data_get_packed_length(&this->u.get_cnu_status_response.cnu_status_data[i0]);
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_QOS_SERVICE_FLOW_STATISTICS_REQUEST:
            {
                count += 1 + (2 * this->u.get_qos_service_flow_statistics_request.svc_flow_idcount);
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_QOS_SERVICE_FLOW_STATISTICS_RESPONSE:
            {
                count += 1 + (36 * this->u.get_qos_service_flow_statistics_response.svc_flow_idcount);
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_CMC_INTERFACES_REQUEST:
            {
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_CMC_INTERFACES_RESPONSE:
            {
                uint32_t i1;
                count += 6;
                if ((this->u.get_cmc_interfaces_response.intf_count > 0) && (this->u.get_cmc_interfaces_response.cmc_interface_data == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"intf_count\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return 0;
                }

                for (i1 = 0; i1 < this->u.get_cmc_interfaces_response.intf_count; i1++)
                {
                    count += bcmolt_epon_oam_brcm_cmc_interface_data_get_packed_length(&this->u.get_cmc_interfaces_response.cmc_interface_data[i1]);
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_CMC_MAC_STATISTICS_REQUEST:
            {
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_CMC_MAC_STATISTICS_RESPONSE:
            {
                count += 26;
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_CMC_INTERFACES_STATISTICS_REQUEST:
            {
                count += 1 + (2 * this->u.get_cmc_interfaces_statistics_request.intf_count);
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_CMC_INTERFACES_STATISTICS_RESPONSE:
            {
                count += 1 + (105 * this->u.get_cmc_interfaces_statistics_response.interfaces_count);
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_QOS_SERVICE_FLOW_CONFIG_REQUEST:
            {
                count += 1 + (2 * this->u.get_qos_service_flow_config_request.svc_flow_idcount);
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_QOS_SERVICE_FLOW_CONFIG_RESPONSE:
            {
                uint32_t i2;
                count += 1;
                if ((this->u.get_qos_service_flow_config_response.svc_flow_count > 0) && (this->u.get_qos_service_flow_config_response.svc_flow_data == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"svc_flow_count\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return 0;
                }

                for (i2 = 0; i2 < this->u.get_qos_service_flow_config_response.svc_flow_count; i2++)
                {
                    count += bcmolt_epon_oam_brcm_cmc_sf_config_data_get_packed_length(&this->u.get_qos_service_flow_config_response.svc_flow_data[i2]);
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_QOS_PACKET_CLASSIFIER_CONFIG_REQUEST:
            {
                count += 1 + (2 * this->u.get_qos_packet_classifier_config_request.svc_flow_idcount);
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_QOS_PACKET_CLASSIFIER_CONFIG_RESPONSE:
            {
                uint32_t i3;
                count += 1;
                if ((this->u.get_qos_packet_classifier_config_response.classifier_count > 0) && (this->u.get_qos_packet_classifier_config_response.classifier_data == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"classifier_count\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return 0;
                }

                for (i3 = 0; i3 < this->u.get_qos_packet_classifier_config_response.classifier_count; i3++)
                {
                    count += bcmolt_epon_oam_brcm_cmc_classifier_config_data_get_packed_length(&this->u.get_qos_packet_classifier_config_response.classifier_data[i3]);
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_UPSTREAM_INPUT_POWER_REQUEST:
            {
                count += 1 + this->u.get_upstream_input_power_request.upstream_channels_count;
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_UPSTREAM_INPUT_POWER_RESPONSE:
            {
                count += 1 + (3 * this->u.get_upstream_input_power_response.upstream_channels_count);
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_UPSTREAM_INPUT_POWER_REQUEST:
            {
                count += 1 + (3 * this->u.set_upstream_input_power_request.upstream_channels_count);
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_UPSTREAM_INPUT_POWER_RESPONSE:
            {
                count += 9;
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_ADD_CNUS_TO_LOAD_BALANCING_GROUP_REQUEST:
            {
                count += 14;
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_ADD_CNUS_TO_LOAD_BALANCING_GROUP_RESPONSE:
            {
                count += 2;
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_EXCLUDE_CNUS_FROM_LOAD_BALANCING_REQUEST:
            {
                count += 13;
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_EXCLUDE_CNUS_FROM_LOAD_BALANCING_RESPONSE:
            {
                count += 1;
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_FULL_LOAD_BALANCING_GROUP_REQUEST:
            {
                count += (5 + this->u.set_full_load_balancing_group_request.downstream_channels_count + this->u.set_full_load_balancing_group_request.upstream_channels_count) + (12 * this->u.set_full_load_balancing_group_request.restrictions_count);
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_FULL_LOAD_BALANCING_GROUP_RESPONSE:
            {
                count += 2;
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_CMC_SYSTEM_EVENT_MESSAGE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_DOWNSTREAM_BONDING_GROUP_STATUS_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_DOWNSTREAM_BONDING_GROUP_STATUS_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_EXCLUDED_ACTIVE_CNUS_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_EXCLUDED_ACTIVE_CNUS_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_EXCLUDED_CNU_CONFIGURATION_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_EXCLUDED_CNUS_CONFIGURATION_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_FULL_LOAD_BALANCING_GROUP_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_FULL_LOAD_BALANCING_GROUP_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_LOAD_BALANCING_GROUP_ACTIVE_CNUS_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_LOAD_BALANCING_GROUP_ACTIVE_CNUS_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_LOAD_BALANCING_GROUP_CNU_CONFIGURATION_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_LOAD_BALANCING_GROUP_CNU_CONFIGURATION_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_LOAD_BALANCING_GROUP_DOWNSTREAMS_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_LOAD_BALANCING_GROUP_DOWNSTREAMS_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_LOAD_BALANCING_GROUP_UPSTREAMS_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_LOAD_BALANCING_GROUP_UPSTREAMS_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_LOAD_BALANCING_GROUPS_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_LOAD_BALANCING_GROUPS_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_MAX_UPSTREAM_RFATTENUATION_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_MAX_UPSTREAM_RFATTENUATION_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_MOVE_CNU_DOWNSTREAM_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_MOVE_CNU_DOWNSTREAM_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_MOVE_CNU_UPSTREAM_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_MOVE_CNU_UPSTREAM_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_SERVICES_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_SERVICES_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_UPSTREAM_BONDING_GROUP_STATUS_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_UPSTREAM_BONDING_GROUP_STATUS_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_REG_RSP_EVENT_MESSAGE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_MAX_UPSTREAM_RFATTENUATION_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_MAX_UPSTREAM_RFATTENUATION_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_MOVE_CNU_DOWNSTREAM_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_MOVE_CNU_DOWNSTREAM_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_MOVE_CNU_UPSTREAM_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_MOVE_CNU_UPSTREAM_RESPONSE:
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_oam_pdu_base_unpack(bcmolt_epon_oam_brcm_oam_pdu_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->version))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->packet_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_brcm_oam_pdu_opcode_unpack(&this->opcode, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->opcode)
    {
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_DOWNSTREAM_CONFIG_REQUEST:
            {
                uint8_t i0;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.set_downstream_config_request.downstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.set_downstream_config_request.downstream_channels_count > 0) && (this->u.set_downstream_config_request.downstream_channels == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"downstream_channels\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_set_downstream_config_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.set_downstream_config_request.downstream_channels = (bcmolt_epon_oam_brcm_downstream_channel_properties *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.set_downstream_config_request.downstream_channels_count * sizeof(bcmolt_epon_oam_brcm_downstream_channel_properties));
                    }
                }

                for (i0 = 0; i0 < this->u.set_downstream_config_request.downstream_channels_count; i0++)
                {
                    if (!bcmolt_epon_oam_brcm_downstream_channel_properties_unpack(&this->u.set_downstream_config_request.downstream_channels[i0], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_DOWNSTREAM_CONFIG_RESPONSE:
            {
                uint8_t i1;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.set_downstream_config_response.downstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.set_downstream_config_response.downstream_channels_count > 0) && (this->u.set_downstream_config_response.downstream_channels == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"downstream_channels\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_set_downstream_config_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.set_downstream_config_response.downstream_channels = (bcmolt_epon_oam_brcm_channel_result *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.set_downstream_config_response.downstream_channels_count * sizeof(bcmolt_epon_oam_brcm_channel_result));
                    }
                }

                for (i1 = 0; i1 < this->u.set_downstream_config_response.downstream_channels_count; i1++)
                {
                    if (!bcmolt_epon_oam_brcm_channel_result_unpack(&this->u.set_downstream_config_response.downstream_channels[i1], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_DOWNSTREAM_CONFIG_REQUEST:
            {
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.get_downstream_config_request.downstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_downstream_config_request.downstream_channels_count > 0) && (this->u.get_downstream_config_request.downstream_channels == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"downstream_channels\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_get_downstream_config_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.get_downstream_config_request.downstream_channels = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.get_downstream_config_request.downstream_channels_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.get_downstream_config_request.downstream_channels, this->u.get_downstream_config_request.downstream_channels_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_DOWNSTREAM_CONFIG_RESPONSE:
            {
                uint8_t i2;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.get_downstream_config_response.downstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_downstream_config_response.downstream_channels_count > 0) && (this->u.get_downstream_config_response.downstream_channels == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"downstream_channels\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_get_downstream_config_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.get_downstream_config_response.downstream_channels = (bcmolt_epon_oam_brcm_downstream_channel_properties *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.get_downstream_config_response.downstream_channels_count * sizeof(bcmolt_epon_oam_brcm_downstream_channel_properties));
                    }
                }

                for (i2 = 0; i2 < this->u.get_downstream_config_response.downstream_channels_count; i2++)
                {
                    if (!bcmolt_epon_oam_brcm_downstream_channel_properties_unpack(&this->u.get_downstream_config_response.downstream_channels[i2], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_UPSTREAM_CONFIG_REQUEST:
            {
                uint8_t i3;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.set_upstream_config_request.upstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.set_upstream_config_request.upstream_channels_count > 0) && (this->u.set_upstream_config_request.upstream_channels == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"upstream_channels\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_set_upstream_config_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.set_upstream_config_request.upstream_channels = (bcmolt_epon_oam_brcm_upstream_channel_properties *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.set_upstream_config_request.upstream_channels_count * sizeof(bcmolt_epon_oam_brcm_upstream_channel_properties));
                    }
                }

                for (i3 = 0; i3 < this->u.set_upstream_config_request.upstream_channels_count; i3++)
                {
                    if (!bcmolt_epon_oam_brcm_upstream_channel_properties_unpack(&this->u.set_upstream_config_request.upstream_channels[i3], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_UPSTREAM_CONFIG_RESPONSE:
            {
                uint8_t i4;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.set_upstream_config_response.upstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.set_upstream_config_response.upstream_channels_count > 0) && (this->u.set_upstream_config_response.upstream_channels == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"upstream_channels\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_set_upstream_config_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.set_upstream_config_response.upstream_channels = (bcmolt_epon_oam_brcm_channel_result *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.set_upstream_config_response.upstream_channels_count * sizeof(bcmolt_epon_oam_brcm_channel_result));
                    }
                }

                for (i4 = 0; i4 < this->u.set_upstream_config_response.upstream_channels_count; i4++)
                {
                    if (!bcmolt_epon_oam_brcm_channel_result_unpack(&this->u.set_upstream_config_response.upstream_channels[i4], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_UPSTREAM_CONFIG_REQUEST:
            {
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.get_upstream_config_request.upstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_upstream_config_request.upstream_channels_count > 0) && (this->u.get_upstream_config_request.upstream_channels == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"upstream_channels\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_get_upstream_config_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.get_upstream_config_request.upstream_channels = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.get_upstream_config_request.upstream_channels_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.get_upstream_config_request.upstream_channels, this->u.get_upstream_config_request.upstream_channels_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_UPSTREAM_CONFIG_RESPONSE:
            {
                uint8_t i5;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.get_upstream_config_response.upstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_upstream_config_response.upstream_channels_count > 0) && (this->u.get_upstream_config_response.upstream_channels == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"upstream_channels\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_get_upstream_config_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.get_upstream_config_response.upstream_channels = (bcmolt_epon_oam_brcm_upstream_channel_properties *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.get_upstream_config_response.upstream_channels_count * sizeof(bcmolt_epon_oam_brcm_upstream_channel_properties));
                    }
                }

                for (i5 = 0; i5 < this->u.get_upstream_config_response.upstream_channels_count; i5++)
                {
                    if (!bcmolt_epon_oam_brcm_upstream_channel_properties_unpack(&this->u.get_upstream_config_response.upstream_channels[i5], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_CREATE_LOAD_BALANCING_GROUP_REQUEST:
            {
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.set_create_load_balancing_group_request.group_id))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_brcm_cmc_load_balance_method_unpack(&this->u.set_create_load_balancing_group_request.method, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_brcm_cmc_request_option_unpack(&this->u.set_create_load_balancing_group_request.request_option, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_CREATE_LOAD_BALANCING_GROUP_RESPONSE:
            {
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.set_create_load_balancing_group_response.group_id))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_brcm_cmc_result_code_unpack(&this->u.set_create_load_balancing_group_response.result_code, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_ADD_DOWNSTREAMS_TO_LOAD_BALANCING_GROUP_REQUEST:
            {
                uint8_t i6;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.set_add_downstreams_to_load_balancing_group_request.group_id))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.set_add_downstreams_to_load_balancing_group_request.downstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.set_add_downstreams_to_load_balancing_group_request.downstream_channels_count > 0) && (this->u.set_add_downstreams_to_load_balancing_group_request.downstream_channels == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"downstream_channels\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_set_add_downstreams_to_load_balancing_group_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.set_add_downstreams_to_load_balancing_group_request.downstream_channels = (bcmolt_epon_oam_brcm_channel_option *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.set_add_downstreams_to_load_balancing_group_request.downstream_channels_count * sizeof(bcmolt_epon_oam_brcm_channel_option));
                    }
                }

                for (i6 = 0; i6 < this->u.set_add_downstreams_to_load_balancing_group_request.downstream_channels_count; i6++)
                {
                    if (!bcmolt_epon_oam_brcm_channel_option_unpack(&this->u.set_add_downstreams_to_load_balancing_group_request.downstream_channels[i6], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_ADD_DOWNSTREAMS_TO_LOAD_BALANCING_GROUP_RESPONSE:
            {
                uint8_t i7;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.set_add_downstreams_to_load_balancing_group_response.group_id))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.set_add_downstreams_to_load_balancing_group_response.downstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.set_add_downstreams_to_load_balancing_group_response.downstream_channels_count > 0) && (this->u.set_add_downstreams_to_load_balancing_group_response.downstream_channels == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"downstream_channels\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_set_add_downstreams_to_load_balancing_group_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.set_add_downstreams_to_load_balancing_group_response.downstream_channels = (bcmolt_epon_oam_brcm_channel_result *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.set_add_downstreams_to_load_balancing_group_response.downstream_channels_count * sizeof(bcmolt_epon_oam_brcm_channel_result));
                    }
                }

                for (i7 = 0; i7 < this->u.set_add_downstreams_to_load_balancing_group_response.downstream_channels_count; i7++)
                {
                    if (!bcmolt_epon_oam_brcm_channel_result_unpack(&this->u.set_add_downstreams_to_load_balancing_group_response.downstream_channels[i7], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_ADD_UPSTREAMS_TO_LOAD_BALANCING_GROUP_REQUEST:
            {
                uint8_t i8;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.set_add_upstreams_to_load_balancing_group_request.group_id))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.set_add_upstreams_to_load_balancing_group_request.upstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.set_add_upstreams_to_load_balancing_group_request.upstream_channels_count > 0) && (this->u.set_add_upstreams_to_load_balancing_group_request.upstream_channels == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"upstream_channels\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_set_add_upstreams_to_load_balancing_group_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.set_add_upstreams_to_load_balancing_group_request.upstream_channels = (bcmolt_epon_oam_brcm_channel_option *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.set_add_upstreams_to_load_balancing_group_request.upstream_channels_count * sizeof(bcmolt_epon_oam_brcm_channel_option));
                    }
                }

                for (i8 = 0; i8 < this->u.set_add_upstreams_to_load_balancing_group_request.upstream_channels_count; i8++)
                {
                    if (!bcmolt_epon_oam_brcm_channel_option_unpack(&this->u.set_add_upstreams_to_load_balancing_group_request.upstream_channels[i8], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_ADD_UPSTREAMS_TO_LOAD_BALANCING_GROUP_RESPONSE:
            {
                uint8_t i9;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.set_add_upstreams_to_load_balancing_group_response.group_id))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.set_add_upstreams_to_load_balancing_group_response.upstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.set_add_upstreams_to_load_balancing_group_response.upstream_channels_count > 0) && (this->u.set_add_upstreams_to_load_balancing_group_response.upstream_channels == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"upstream_channels\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_set_add_upstreams_to_load_balancing_group_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.set_add_upstreams_to_load_balancing_group_response.upstream_channels = (bcmolt_epon_oam_brcm_channel_result *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.set_add_upstreams_to_load_balancing_group_response.upstream_channels_count * sizeof(bcmolt_epon_oam_brcm_channel_result));
                    }
                }

                for (i9 = 0; i9 < this->u.set_add_upstreams_to_load_balancing_group_response.upstream_channels_count; i9++)
                {
                    if (!bcmolt_epon_oam_brcm_channel_result_unpack(&this->u.set_add_upstreams_to_load_balancing_group_response.upstream_channels[i9], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_SIGNAL_QUALITY_REQUEST:
            {
                uint8_t i10;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.get_signal_quality_request.upstream_interfaces_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_signal_quality_request.upstream_interfaces_count > 0) && (this->u.get_signal_quality_request.upstream_interfaces == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"upstream_interfaces\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_get_signal_quality_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.get_signal_quality_request.upstream_interfaces = (uint16_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.get_signal_quality_request.upstream_interfaces_count * sizeof(uint16_t));
                    }
                }

                for (i10 = 0; i10 < this->u.get_signal_quality_request.upstream_interfaces_count; i10++)
                {
                    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.get_signal_quality_request.upstream_interfaces[i10]))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_SIGNAL_QUALITY_RESPONSE:
            {
                uint8_t i11;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.get_signal_quality_response.upstream_interfaces_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_signal_quality_response.upstream_interfaces_count > 0) && (this->u.get_signal_quality_response.upstream_interfaces == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"upstream_interfaces\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_get_signal_quality_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.get_signal_quality_response.upstream_interfaces = (bcmolt_epon_oam_brcm_upstream_signal_quality *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.get_signal_quality_response.upstream_interfaces_count * sizeof(bcmolt_epon_oam_brcm_upstream_signal_quality));
                    }
                }

                for (i11 = 0; i11 < this->u.get_signal_quality_response.upstream_interfaces_count; i11++)
                {
                    if (!bcmolt_epon_oam_brcm_upstream_signal_quality_unpack(&this->u.get_signal_quality_response.upstream_interfaces[i11], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_CNU_STATUS_REQUEST:
            {
                uint16_t i12;
                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.get_cnu_status_request.cnu_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_cnu_status_request.cnu_count > 0) && (this->u.get_cnu_status_request.cnu_mac_address == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"cnu_mac_address\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_get_cnu_status_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.get_cnu_status_request.cnu_mac_address = (bcmos_mac_address *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.get_cnu_status_request.cnu_count * sizeof(bcmos_mac_address));
                    }
                }

                for (i12 = 0; i12 < this->u.get_cnu_status_request.cnu_count; i12++)
                {
                    if (!bcmolt_epon_oam_buf_read_mac_address(buf, &this->u.get_cnu_status_request.cnu_mac_address[i12]))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_CNU_STATUS_RESPONSE:
            {
                uint16_t i13;
                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.get_cnu_status_response.cnu_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_cnu_status_response.cnu_count > 0) && (this->u.get_cnu_status_response.cnu_status_data == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"cnu_status_data\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_get_cnu_status_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.get_cnu_status_response.cnu_status_data = (bcmolt_epon_oam_brcm_cnu_status_data *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.get_cnu_status_response.cnu_count * sizeof(bcmolt_epon_oam_brcm_cnu_status_data));
                    }
                }

                for (i13 = 0; i13 < this->u.get_cnu_status_response.cnu_count; i13++)
                {
                    if (!bcmolt_epon_oam_brcm_cnu_status_data_unpack(&this->u.get_cnu_status_response.cnu_status_data[i13], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_QOS_SERVICE_FLOW_STATISTICS_REQUEST:
            {
                uint8_t i14;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.get_qos_service_flow_statistics_request.svc_flow_idcount))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_qos_service_flow_statistics_request.svc_flow_idcount > 0) && (this->u.get_qos_service_flow_statistics_request.svc_flow_ids == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"svc_flow_ids\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_get_qos_service_flow_statistics_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.get_qos_service_flow_statistics_request.svc_flow_ids = (uint16_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.get_qos_service_flow_statistics_request.svc_flow_idcount * sizeof(uint16_t));
                    }
                }

                for (i14 = 0; i14 < this->u.get_qos_service_flow_statistics_request.svc_flow_idcount; i14++)
                {
                    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.get_qos_service_flow_statistics_request.svc_flow_ids[i14]))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_QOS_SERVICE_FLOW_STATISTICS_RESPONSE:
            {
                uint8_t i15;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.get_qos_service_flow_statistics_response.svc_flow_idcount))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_qos_service_flow_statistics_response.svc_flow_idcount > 0) && (this->u.get_qos_service_flow_statistics_response.svc_flow_data == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"svc_flow_data\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_get_qos_service_flow_statistics_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.get_qos_service_flow_statistics_response.svc_flow_data = (bcmolt_epon_oam_brcm_cmc_sf_stats_data *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.get_qos_service_flow_statistics_response.svc_flow_idcount * sizeof(bcmolt_epon_oam_brcm_cmc_sf_stats_data));
                    }
                }

                for (i15 = 0; i15 < this->u.get_qos_service_flow_statistics_response.svc_flow_idcount; i15++)
                {
                    if (!bcmolt_epon_oam_brcm_cmc_sf_stats_data_unpack(&this->u.get_qos_service_flow_statistics_response.svc_flow_data[i15], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_CMC_INTERFACES_REQUEST:
            {
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_CMC_INTERFACES_RESPONSE:
            {
                uint16_t i16;
                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.get_cmc_interfaces_response.intf_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(buf, &this->u.get_cmc_interfaces_response.timestamp))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_cmc_interfaces_response.intf_count > 0) && (this->u.get_cmc_interfaces_response.cmc_interface_data == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"cmc_interface_data\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_get_cmc_interfaces_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.get_cmc_interfaces_response.cmc_interface_data = (bcmolt_epon_oam_brcm_cmc_interface_data *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.get_cmc_interfaces_response.intf_count * sizeof(bcmolt_epon_oam_brcm_cmc_interface_data));
                    }
                }

                for (i16 = 0; i16 < this->u.get_cmc_interfaces_response.intf_count; i16++)
                {
                    if (!bcmolt_epon_oam_brcm_cmc_interface_data_unpack(&this->u.get_cmc_interfaces_response.cmc_interface_data[i16], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_CMC_MAC_STATISTICS_REQUEST:
            {
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_CMC_MAC_STATISTICS_RESPONSE:
            {
                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.get_cmc_mac_statistics_response.interface_index))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(buf, &this->u.get_cmc_mac_statistics_response.invalid_rng_reqs))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(buf, &this->u.get_cmc_mac_statistics_response.rng_aborts))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(buf, &this->u.get_cmc_mac_statistics_response.invalid_reg_reqs))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(buf, &this->u.get_cmc_mac_statistics_response.failed_reg_reqs))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(buf, &this->u.get_cmc_mac_statistics_response.invalid_data_reqs))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(buf, &this->u.get_cmc_mac_statistics_response.t5timeouts))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_CMC_INTERFACES_STATISTICS_REQUEST:
            {
                uint8_t i17;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.get_cmc_interfaces_statistics_request.intf_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_cmc_interfaces_statistics_request.intf_count > 0) && (this->u.get_cmc_interfaces_statistics_request.intf_index == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"intf_index\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_get_cmc_interfaces_statistics_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.get_cmc_interfaces_statistics_request.intf_index = (uint16_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.get_cmc_interfaces_statistics_request.intf_count * sizeof(uint16_t));
                    }
                }

                for (i17 = 0; i17 < this->u.get_cmc_interfaces_statistics_request.intf_count; i17++)
                {
                    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.get_cmc_interfaces_statistics_request.intf_index[i17]))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_CMC_INTERFACES_STATISTICS_RESPONSE:
            {
                uint8_t i18;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.get_cmc_interfaces_statistics_response.interfaces_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_cmc_interfaces_statistics_response.interfaces_count > 0) && (this->u.get_cmc_interfaces_statistics_response.network_interfaces == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"network_interfaces\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_get_cmc_interfaces_statistics_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.get_cmc_interfaces_statistics_response.network_interfaces = (bcmolt_epon_oam_brcm_cmc_intf_stats_data *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.get_cmc_interfaces_statistics_response.interfaces_count * sizeof(bcmolt_epon_oam_brcm_cmc_intf_stats_data));
                    }
                }

                for (i18 = 0; i18 < this->u.get_cmc_interfaces_statistics_response.interfaces_count; i18++)
                {
                    if (!bcmolt_epon_oam_brcm_cmc_intf_stats_data_unpack(&this->u.get_cmc_interfaces_statistics_response.network_interfaces[i18], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_QOS_SERVICE_FLOW_CONFIG_REQUEST:
            {
                uint8_t i19;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.get_qos_service_flow_config_request.svc_flow_idcount))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_qos_service_flow_config_request.svc_flow_idcount > 0) && (this->u.get_qos_service_flow_config_request.svc_flow_ids == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"svc_flow_ids\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_get_qos_service_flow_config_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.get_qos_service_flow_config_request.svc_flow_ids = (uint16_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.get_qos_service_flow_config_request.svc_flow_idcount * sizeof(uint16_t));
                    }
                }

                for (i19 = 0; i19 < this->u.get_qos_service_flow_config_request.svc_flow_idcount; i19++)
                {
                    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.get_qos_service_flow_config_request.svc_flow_ids[i19]))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_QOS_SERVICE_FLOW_CONFIG_RESPONSE:
            {
                uint8_t i20;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.get_qos_service_flow_config_response.svc_flow_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_qos_service_flow_config_response.svc_flow_count > 0) && (this->u.get_qos_service_flow_config_response.svc_flow_data == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"svc_flow_data\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_get_qos_service_flow_config_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.get_qos_service_flow_config_response.svc_flow_data = (bcmolt_epon_oam_brcm_cmc_sf_config_data *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.get_qos_service_flow_config_response.svc_flow_count * sizeof(bcmolt_epon_oam_brcm_cmc_sf_config_data));
                    }
                }

                for (i20 = 0; i20 < this->u.get_qos_service_flow_config_response.svc_flow_count; i20++)
                {
                    if (!bcmolt_epon_oam_brcm_cmc_sf_config_data_unpack(&this->u.get_qos_service_flow_config_response.svc_flow_data[i20], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_QOS_PACKET_CLASSIFIER_CONFIG_REQUEST:
            {
                uint8_t i21;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.get_qos_packet_classifier_config_request.svc_flow_idcount))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_qos_packet_classifier_config_request.svc_flow_idcount > 0) && (this->u.get_qos_packet_classifier_config_request.svc_flow_ids == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"svc_flow_ids\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_get_qos_packet_classifier_config_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.get_qos_packet_classifier_config_request.svc_flow_ids = (uint16_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.get_qos_packet_classifier_config_request.svc_flow_idcount * sizeof(uint16_t));
                    }
                }

                for (i21 = 0; i21 < this->u.get_qos_packet_classifier_config_request.svc_flow_idcount; i21++)
                {
                    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.get_qos_packet_classifier_config_request.svc_flow_ids[i21]))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_QOS_PACKET_CLASSIFIER_CONFIG_RESPONSE:
            {
                uint8_t i22;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.get_qos_packet_classifier_config_response.classifier_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_qos_packet_classifier_config_response.classifier_count > 0) && (this->u.get_qos_packet_classifier_config_response.classifier_data == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"classifier_data\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_get_qos_packet_classifier_config_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.get_qos_packet_classifier_config_response.classifier_data = (bcmolt_epon_oam_brcm_cmc_classifier_config_data *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.get_qos_packet_classifier_config_response.classifier_count * sizeof(bcmolt_epon_oam_brcm_cmc_classifier_config_data));
                    }
                }

                for (i22 = 0; i22 < this->u.get_qos_packet_classifier_config_response.classifier_count; i22++)
                {
                    if (!bcmolt_epon_oam_brcm_cmc_classifier_config_data_unpack(&this->u.get_qos_packet_classifier_config_response.classifier_data[i22], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_UPSTREAM_INPUT_POWER_REQUEST:
            {
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.get_upstream_input_power_request.upstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_upstream_input_power_request.upstream_channels_count > 0) && (this->u.get_upstream_input_power_request.upstream_channels == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"upstream_channels\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_get_upstream_input_power_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.get_upstream_input_power_request.upstream_channels = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.get_upstream_input_power_request.upstream_channels_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.get_upstream_input_power_request.upstream_channels, this->u.get_upstream_input_power_request.upstream_channels_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_UPSTREAM_INPUT_POWER_RESPONSE:
            {
                uint8_t i23;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.get_upstream_input_power_response.upstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_upstream_input_power_response.upstream_channels_count > 0) && (this->u.get_upstream_input_power_response.upstream_channels == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"upstream_channels\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_get_upstream_input_power_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.get_upstream_input_power_response.upstream_channels = (bcmolt_epon_oam_brcm_upstream_channel_power *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.get_upstream_input_power_response.upstream_channels_count * sizeof(bcmolt_epon_oam_brcm_upstream_channel_power));
                    }
                }

                for (i23 = 0; i23 < this->u.get_upstream_input_power_response.upstream_channels_count; i23++)
                {
                    if (!bcmolt_epon_oam_brcm_upstream_channel_power_unpack(&this->u.get_upstream_input_power_response.upstream_channels[i23], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_UPSTREAM_INPUT_POWER_REQUEST:
            {
                uint8_t i24;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.set_upstream_input_power_request.upstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.set_upstream_input_power_request.upstream_channels_count > 0) && (this->u.set_upstream_input_power_request.upstream_channels == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"upstream_channels\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_set_upstream_input_power_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.set_upstream_input_power_request.upstream_channels = (bcmolt_epon_oam_brcm_upstream_channel_power *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.set_upstream_input_power_request.upstream_channels_count * sizeof(bcmolt_epon_oam_brcm_upstream_channel_power));
                    }
                }

                for (i24 = 0; i24 < this->u.set_upstream_input_power_request.upstream_channels_count; i24++)
                {
                    if (!bcmolt_epon_oam_brcm_upstream_channel_power_unpack(&this->u.set_upstream_input_power_request.upstream_channels[i24], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_UPSTREAM_INPUT_POWER_RESPONSE:
            {
                if (!bcmolt_epon_oam_brcm_cmc_result_code_unpack(&this->u.set_upstream_input_power_response.result_code, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.set_upstream_input_power_response.channel_one_power))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.set_upstream_input_power_response.channel_two_power))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.set_upstream_input_power_response.channel_three_power))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.set_upstream_input_power_response.channel_four_power))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_ADD_CNUS_TO_LOAD_BALANCING_GROUP_REQUEST:
            {
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.set_add_cnus_to_load_balancing_group_request.group_id))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_brcm_cmc_request_option_unpack(&this->u.set_add_cnus_to_load_balancing_group_request.request_option, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_brcm_cnu_mac_addr_range_unpack(&this->u.set_add_cnus_to_load_balancing_group_request.cnu_mac_range, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_ADD_CNUS_TO_LOAD_BALANCING_GROUP_RESPONSE:
            {
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.set_add_cnus_to_load_balancing_group_response.group_id))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_brcm_cmc_result_code_unpack(&this->u.set_add_cnus_to_load_balancing_group_response.result_code, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_EXCLUDE_CNUS_FROM_LOAD_BALANCING_REQUEST:
            {
                if (!bcmolt_epon_oam_brcm_cmc_request_option_unpack(&this->u.set_exclude_cnus_from_load_balancing_request.request_option, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_mac_address(buf, &this->u.set_exclude_cnus_from_load_balancing_request.cnu_mac_address_start))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_mac_address(buf, &this->u.set_exclude_cnus_from_load_balancing_request.cnu_mac_address_end))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_EXCLUDE_CNUS_FROM_LOAD_BALANCING_RESPONSE:
            {
                if (!bcmolt_epon_oam_brcm_cmc_result_code_unpack(&this->u.set_exclude_cnus_from_load_balancing_response.result_code, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_FULL_LOAD_BALANCING_GROUP_REQUEST:
            {
                uint8_t i25;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.set_full_load_balancing_group_request.group_id))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_brcm_cmc_load_balance_method_unpack(&this->u.set_full_load_balancing_group_request.method, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.set_full_load_balancing_group_request.downstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.set_full_load_balancing_group_request.downstream_channels_count > 0) && (this->u.set_full_load_balancing_group_request.downstream_channels == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"downstream_channels\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_set_full_load_balancing_group_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.set_full_load_balancing_group_request.downstream_channels = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.set_full_load_balancing_group_request.downstream_channels_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.set_full_load_balancing_group_request.downstream_channels, this->u.set_full_load_balancing_group_request.downstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.set_full_load_balancing_group_request.upstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.set_full_load_balancing_group_request.upstream_channels_count > 0) && (this->u.set_full_load_balancing_group_request.upstream_channels == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"upstream_channels\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_set_full_load_balancing_group_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.set_full_load_balancing_group_request.upstream_channels = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.set_full_load_balancing_group_request.upstream_channels_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.set_full_load_balancing_group_request.upstream_channels, this->u.set_full_load_balancing_group_request.upstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.set_full_load_balancing_group_request.restrictions_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.set_full_load_balancing_group_request.restrictions_count > 0) && (this->u.set_full_load_balancing_group_request.restrictions == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"restrictions\" of struct \"bcmolt_epon_oam_brcm_oam_pdu_base_set_full_load_balancing_group_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.set_full_load_balancing_group_request.restrictions = (bcmolt_epon_oam_brcm_cnu_mac_addr_range *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.set_full_load_balancing_group_request.restrictions_count * sizeof(bcmolt_epon_oam_brcm_cnu_mac_addr_range));
                    }
                }

                for (i25 = 0; i25 < this->u.set_full_load_balancing_group_request.restrictions_count; i25++)
                {
                    if (!bcmolt_epon_oam_brcm_cnu_mac_addr_range_unpack(&this->u.set_full_load_balancing_group_request.restrictions[i25], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_FULL_LOAD_BALANCING_GROUP_RESPONSE:
            {
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.set_full_load_balancing_group_response.group_id))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_brcm_cmc_result_code_unpack(&this->u.set_full_load_balancing_group_response.result_code, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_CMC_SYSTEM_EVENT_MESSAGE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_DOWNSTREAM_BONDING_GROUP_STATUS_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_DOWNSTREAM_BONDING_GROUP_STATUS_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_EXCLUDED_ACTIVE_CNUS_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_EXCLUDED_ACTIVE_CNUS_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_EXCLUDED_CNU_CONFIGURATION_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_EXCLUDED_CNUS_CONFIGURATION_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_FULL_LOAD_BALANCING_GROUP_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_FULL_LOAD_BALANCING_GROUP_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_LOAD_BALANCING_GROUP_ACTIVE_CNUS_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_LOAD_BALANCING_GROUP_ACTIVE_CNUS_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_LOAD_BALANCING_GROUP_CNU_CONFIGURATION_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_LOAD_BALANCING_GROUP_CNU_CONFIGURATION_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_LOAD_BALANCING_GROUP_DOWNSTREAMS_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_LOAD_BALANCING_GROUP_DOWNSTREAMS_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_LOAD_BALANCING_GROUP_UPSTREAMS_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_LOAD_BALANCING_GROUP_UPSTREAMS_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_LOAD_BALANCING_GROUPS_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_LOAD_BALANCING_GROUPS_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_MAX_UPSTREAM_RFATTENUATION_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_MAX_UPSTREAM_RFATTENUATION_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_MOVE_CNU_DOWNSTREAM_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_MOVE_CNU_DOWNSTREAM_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_MOVE_CNU_UPSTREAM_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_MOVE_CNU_UPSTREAM_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_SERVICES_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_SERVICES_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_UPSTREAM_BONDING_GROUP_STATUS_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_UPSTREAM_BONDING_GROUP_STATUS_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_REG_RSP_EVENT_MESSAGE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_MAX_UPSTREAM_RFATTENUATION_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_MAX_UPSTREAM_RFATTENUATION_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_MOVE_CNU_DOWNSTREAM_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_MOVE_CNU_DOWNSTREAM_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_MOVE_CNU_UPSTREAM_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_MOVE_CNU_UPSTREAM_RESPONSE:
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_brcm_oam_pdu_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_brcm_oam_pdu_opcode opcode;
    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 2))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_brcm_oam_pdu_opcode_unpack(&opcode, packed))
    {
        return BCMOS_FALSE;
    }

    switch (opcode)
    {
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_DOWNSTREAM_CONFIG_REQUEST:
            {
                uint8_t downstream_channels_count;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &downstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_brcm_downstream_channel_properties) * downstream_channels_count);
                if (!bcmolt_epon_oam_buf_skip(packed, downstream_channels_count * 13))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_DOWNSTREAM_CONFIG_RESPONSE:
            {
                uint8_t downstream_channels_count;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &downstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_brcm_channel_result) * downstream_channels_count);
                if (!bcmolt_epon_oam_buf_skip(packed, downstream_channels_count * 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_DOWNSTREAM_CONFIG_REQUEST:
            {
                uint8_t downstream_channels_count;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &downstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * downstream_channels_count);
                if (!bcmolt_epon_oam_buf_skip(packed, downstream_channels_count * 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_DOWNSTREAM_CONFIG_RESPONSE:
            {
                uint8_t downstream_channels_count;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &downstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_brcm_downstream_channel_properties) * downstream_channels_count);
                if (!bcmolt_epon_oam_buf_skip(packed, downstream_channels_count * 13))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_UPSTREAM_CONFIG_REQUEST:
            {
                uint8_t upstream_channels_count;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &upstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_brcm_upstream_channel_properties) * upstream_channels_count);
                if (!bcmolt_epon_oam_buf_skip(packed, upstream_channels_count * 33))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_UPSTREAM_CONFIG_RESPONSE:
            {
                uint8_t upstream_channels_count;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &upstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_brcm_channel_result) * upstream_channels_count);
                if (!bcmolt_epon_oam_buf_skip(packed, upstream_channels_count * 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_UPSTREAM_CONFIG_REQUEST:
            {
                uint8_t upstream_channels_count;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &upstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * upstream_channels_count);
                if (!bcmolt_epon_oam_buf_skip(packed, upstream_channels_count * 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_UPSTREAM_CONFIG_RESPONSE:
            {
                uint8_t upstream_channels_count;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &upstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_brcm_upstream_channel_properties) * upstream_channels_count);
                if (!bcmolt_epon_oam_buf_skip(packed, upstream_channels_count * 33))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_CREATE_LOAD_BALANCING_GROUP_REQUEST:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_CREATE_LOAD_BALANCING_GROUP_RESPONSE:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_ADD_DOWNSTREAMS_TO_LOAD_BALANCING_GROUP_REQUEST:
            {
                uint8_t downstream_channels_count;
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(packed, &downstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_brcm_channel_option) * downstream_channels_count);
                if (!bcmolt_epon_oam_buf_skip(packed, downstream_channels_count * 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_ADD_DOWNSTREAMS_TO_LOAD_BALANCING_GROUP_RESPONSE:
            {
                uint8_t downstream_channels_count;
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(packed, &downstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_brcm_channel_result) * downstream_channels_count);
                if (!bcmolt_epon_oam_buf_skip(packed, downstream_channels_count * 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_ADD_UPSTREAMS_TO_LOAD_BALANCING_GROUP_REQUEST:
            {
                uint8_t upstream_channels_count;
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(packed, &upstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_brcm_channel_option) * upstream_channels_count);
                if (!bcmolt_epon_oam_buf_skip(packed, upstream_channels_count * 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_ADD_UPSTREAMS_TO_LOAD_BALANCING_GROUP_RESPONSE:
            {
                uint8_t upstream_channels_count;
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(packed, &upstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_brcm_channel_result) * upstream_channels_count);
                if (!bcmolt_epon_oam_buf_skip(packed, upstream_channels_count * 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_SIGNAL_QUALITY_REQUEST:
            {
                uint8_t upstream_interfaces_count;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &upstream_interfaces_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint16_t) * upstream_interfaces_count);
                if (!bcmolt_epon_oam_buf_skip(packed, upstream_interfaces_count * 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_SIGNAL_QUALITY_RESPONSE:
            {
                uint8_t upstream_interfaces_count;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &upstream_interfaces_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_brcm_upstream_signal_quality) * upstream_interfaces_count);
                if (!bcmolt_epon_oam_buf_skip(packed, upstream_interfaces_count * 32))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_CNU_STATUS_REQUEST:
            {
                uint16_t cnu_count;
                if (!bcmolt_epon_oam_buf_read_u16(packed, &cnu_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmos_mac_address) * cnu_count);
                if (!bcmolt_epon_oam_buf_skip(packed, cnu_count * 6))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_CNU_STATUS_RESPONSE:
            {
                uint16_t cnu_count;
                uint16_t i0;
                if (!bcmolt_epon_oam_buf_read_u16(packed, &cnu_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_brcm_cnu_status_data) * cnu_count);
                for (i0 = 0; i0 < cnu_count; i0++)
                {
                    if (!bcmolt_epon_oam_brcm_cnu_status_data_scan(packed, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_QOS_SERVICE_FLOW_STATISTICS_REQUEST:
            {
                uint8_t svc_flow_idcount;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &svc_flow_idcount))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint16_t) * svc_flow_idcount);
                if (!bcmolt_epon_oam_buf_skip(packed, svc_flow_idcount * 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_QOS_SERVICE_FLOW_STATISTICS_RESPONSE:
            {
                uint8_t svc_flow_idcount;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &svc_flow_idcount))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_brcm_cmc_sf_stats_data) * svc_flow_idcount);
                if (!bcmolt_epon_oam_buf_skip(packed, svc_flow_idcount * 36))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_CMC_INTERFACES_REQUEST:
            {
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_CMC_INTERFACES_RESPONSE:
            {
                uint16_t intf_count;
                uint16_t i1;
                if (!bcmolt_epon_oam_buf_read_u16(packed, &intf_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_brcm_cmc_interface_data) * intf_count);
                for (i1 = 0; i1 < intf_count; i1++)
                {
                    if (!bcmolt_epon_oam_brcm_cmc_interface_data_scan(packed, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_CMC_MAC_STATISTICS_REQUEST:
            {
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_CMC_MAC_STATISTICS_RESPONSE:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_CMC_INTERFACES_STATISTICS_REQUEST:
            {
                uint8_t intf_count;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &intf_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint16_t) * intf_count);
                if (!bcmolt_epon_oam_buf_skip(packed, intf_count * 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_CMC_INTERFACES_STATISTICS_RESPONSE:
            {
                uint8_t interfaces_count;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &interfaces_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_brcm_cmc_intf_stats_data) * interfaces_count);
                if (!bcmolt_epon_oam_buf_skip(packed, interfaces_count * 105))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_QOS_SERVICE_FLOW_CONFIG_REQUEST:
            {
                uint8_t svc_flow_idcount;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &svc_flow_idcount))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint16_t) * svc_flow_idcount);
                if (!bcmolt_epon_oam_buf_skip(packed, svc_flow_idcount * 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_QOS_SERVICE_FLOW_CONFIG_RESPONSE:
            {
                uint8_t svc_flow_count;
                uint8_t i2;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &svc_flow_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_brcm_cmc_sf_config_data) * svc_flow_count);
                for (i2 = 0; i2 < svc_flow_count; i2++)
                {
                    if (!bcmolt_epon_oam_brcm_cmc_sf_config_data_scan(packed, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_QOS_PACKET_CLASSIFIER_CONFIG_REQUEST:
            {
                uint8_t svc_flow_idcount;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &svc_flow_idcount))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint16_t) * svc_flow_idcount);
                if (!bcmolt_epon_oam_buf_skip(packed, svc_flow_idcount * 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_QOS_PACKET_CLASSIFIER_CONFIG_RESPONSE:
            {
                uint8_t classifier_count;
                uint8_t i3;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &classifier_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_brcm_cmc_classifier_config_data) * classifier_count);
                for (i3 = 0; i3 < classifier_count; i3++)
                {
                    if (!bcmolt_epon_oam_brcm_cmc_classifier_config_data_scan(packed, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_UPSTREAM_INPUT_POWER_REQUEST:
            {
                uint8_t upstream_channels_count;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &upstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * upstream_channels_count);
                if (!bcmolt_epon_oam_buf_skip(packed, upstream_channels_count * 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_UPSTREAM_INPUT_POWER_RESPONSE:
            {
                uint8_t upstream_channels_count;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &upstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_brcm_upstream_channel_power) * upstream_channels_count);
                if (!bcmolt_epon_oam_buf_skip(packed, upstream_channels_count * 3))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_UPSTREAM_INPUT_POWER_REQUEST:
            {
                uint8_t upstream_channels_count;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &upstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_brcm_upstream_channel_power) * upstream_channels_count);
                if (!bcmolt_epon_oam_buf_skip(packed, upstream_channels_count * 3))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_UPSTREAM_INPUT_POWER_RESPONSE:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_ADD_CNUS_TO_LOAD_BALANCING_GROUP_REQUEST:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 12))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_ADD_CNUS_TO_LOAD_BALANCING_GROUP_RESPONSE:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_EXCLUDE_CNUS_FROM_LOAD_BALANCING_REQUEST:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 6))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 6))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_EXCLUDE_CNUS_FROM_LOAD_BALANCING_RESPONSE:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_FULL_LOAD_BALANCING_GROUP_REQUEST:
            {
                uint8_t downstream_channels_count;
                uint8_t upstream_channels_count;
                uint8_t restrictions_count;
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(packed, &downstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * downstream_channels_count);
                if (!bcmolt_epon_oam_buf_skip(packed, downstream_channels_count * 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(packed, &upstream_channels_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * upstream_channels_count);
                if (!bcmolt_epon_oam_buf_skip(packed, upstream_channels_count * 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(packed, &restrictions_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_brcm_cnu_mac_addr_range) * restrictions_count);
                if (!bcmolt_epon_oam_buf_skip(packed, restrictions_count * 12))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_FULL_LOAD_BALANCING_GROUP_RESPONSE:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_CMC_SYSTEM_EVENT_MESSAGE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_DOWNSTREAM_BONDING_GROUP_STATUS_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_DOWNSTREAM_BONDING_GROUP_STATUS_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_EXCLUDED_ACTIVE_CNUS_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_EXCLUDED_ACTIVE_CNUS_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_EXCLUDED_CNU_CONFIGURATION_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_EXCLUDED_CNUS_CONFIGURATION_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_FULL_LOAD_BALANCING_GROUP_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_FULL_LOAD_BALANCING_GROUP_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_LOAD_BALANCING_GROUP_ACTIVE_CNUS_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_LOAD_BALANCING_GROUP_ACTIVE_CNUS_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_LOAD_BALANCING_GROUP_CNU_CONFIGURATION_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_LOAD_BALANCING_GROUP_CNU_CONFIGURATION_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_LOAD_BALANCING_GROUP_DOWNSTREAMS_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_LOAD_BALANCING_GROUP_DOWNSTREAMS_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_LOAD_BALANCING_GROUP_UPSTREAMS_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_LOAD_BALANCING_GROUP_UPSTREAMS_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_LOAD_BALANCING_GROUPS_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_LOAD_BALANCING_GROUPS_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_MAX_UPSTREAM_RFATTENUATION_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_MAX_UPSTREAM_RFATTENUATION_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_MOVE_CNU_DOWNSTREAM_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_MOVE_CNU_DOWNSTREAM_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_MOVE_CNU_UPSTREAM_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_MOVE_CNU_UPSTREAM_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_SERVICES_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_SERVICES_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_UPSTREAM_BONDING_GROUP_STATUS_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_GET_UPSTREAM_BONDING_GROUP_STATUS_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_REG_RSP_EVENT_MESSAGE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_MAX_UPSTREAM_RFATTENUATION_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_MAX_UPSTREAM_RFATTENUATION_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_MOVE_CNU_DOWNSTREAM_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_MOVE_CNU_DOWNSTREAM_RESPONSE:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_MOVE_CNU_UPSTREAM_REQUEST:
        case BCMOLT_EPON_OAM_BRCM_OAM_PDU_OPCODE_SET_MOVE_CNU_UPSTREAM_RESPONSE:
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_certificate_pack(bcmolt_epon_oam_certificate *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u24(buf, this->size))
    {
        return BCMOS_FALSE;
    }

    if ((uint24_t_to_uint32_t(this->size) > 0) && (this->certificate_data == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"certificate_data\" of struct \"bcmolt_epon_oam_certificate\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write(buf, this->certificate_data, uint24_t_to_uint32_t(this->size)))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_certificate_get_packed_length(bcmolt_epon_oam_certificate *this)
{
    return 3 + uint24_t_to_uint32_t(this->size);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_certificate_unpack(bcmolt_epon_oam_certificate *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u24(buf, &this->size))
    {
        return BCMOS_FALSE;
    }

    if ((uint24_t_to_uint32_t(this->size) > 0) && (this->certificate_data == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"certificate_data\" of struct \"bcmolt_epon_oam_certificate\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->certificate_data = (uint8_t *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(uint24_t_to_uint32_t(this->size) * sizeof(uint8_t));
        }
    }

    if (!bcmolt_epon_oam_buf_read(buf, this->certificate_data, uint24_t_to_uint32_t(this->size)))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_certificate_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    uint24_t size;
    if (!bcmolt_epon_oam_buf_read_u24(packed, &size))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * uint24_t_to_uint32_t(size));
    if (!bcmolt_epon_oam_buf_skip(packed, uint24_t_to_uint32_t(size) * 1))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_action_value_pack(bcmolt_epon_oam_ctc_action_value *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_var_leaf_action_pack(this->leaf, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->leaf)
    {
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_PHY_ADMIN_CONTROL:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.phy_admin_control.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.phy_admin_control.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_enabled_state_pack(this->u.phy_admin_control.state, buf))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_AUTO_RENEGOTIATE:
            {
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_AUTO_ADMIN_CONTROL:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.auto_admin_control.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.auto_admin_control.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_enabled_state_pack(this->u.auto_admin_control.state, buf))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_MAC_ADD_GROUP_ADDRESS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_MAC_DEL_GROUP_ADDRESS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_MAC_INIT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_MAC_SELF_TEST:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_MAU_ADMIN_CONTROL:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_MAU_RESET:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_PORT_ADMIN_CONTROL:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_RPT_IN_SERVICE_TEST:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_RPT_RESET:
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_action_value_get_packed_length(bcmolt_epon_oam_ctc_action_value *this)
{
    uint32_t count = 2;
    switch (this->leaf)
    {
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_PHY_ADMIN_CONTROL:
            {
                count += 5;
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_AUTO_RENEGOTIATE:
            {
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_AUTO_ADMIN_CONTROL:
            {
                count += 5;
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_MAC_ADD_GROUP_ADDRESS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_MAC_DEL_GROUP_ADDRESS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_MAC_INIT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_MAC_SELF_TEST:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_MAU_ADMIN_CONTROL:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_MAU_RESET:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_PORT_ADMIN_CONTROL:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_RPT_IN_SERVICE_TEST:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_RPT_RESET:
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_action_value_unpack(bcmolt_epon_oam_ctc_action_value *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_var_leaf_action_unpack(&this->leaf, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->leaf)
    {
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_PHY_ADMIN_CONTROL:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.phy_admin_control.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.phy_admin_control.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.phy_admin_control.width == 0) ? 0x0080 : this->u.phy_admin_control.width, buf->curr);
                if (!bcmolt_epon_oam_ctc_enabled_state_unpack(&this->u.phy_admin_control.state, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.phy_admin_control.width == 0) ? 0x0080 : this->u.phy_admin_control.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_AUTO_RENEGOTIATE:
            {
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_AUTO_ADMIN_CONTROL:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.auto_admin_control.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.auto_admin_control.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.auto_admin_control.width == 0) ? 0x0080 : this->u.auto_admin_control.width, buf->curr);
                if (!bcmolt_epon_oam_ctc_enabled_state_unpack(&this->u.auto_admin_control.state, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.auto_admin_control.width == 0) ? 0x0080 : this->u.auto_admin_control.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_MAC_ADD_GROUP_ADDRESS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_MAC_DEL_GROUP_ADDRESS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_MAC_INIT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_MAC_SELF_TEST:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_MAU_ADMIN_CONTROL:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_MAU_RESET:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_PORT_ADMIN_CONTROL:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_RPT_IN_SERVICE_TEST:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_RPT_RESET:
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_action_value_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_var_leaf_action leaf;
    if (!bcmolt_epon_oam_var_leaf_action_unpack(&leaf, packed))
    {
        return BCMOS_FALSE;
    }

    switch (leaf)
    {
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_PHY_ADMIN_CONTROL:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_AUTO_RENEGOTIATE:
            {
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_AUTO_ADMIN_CONTROL:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_MAC_ADD_GROUP_ADDRESS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_MAC_DEL_GROUP_ADDRESS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_MAC_INIT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_MAC_SELF_TEST:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_MAU_ADMIN_CONTROL:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_MAU_RESET:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_PORT_ADMIN_CONTROL:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_RPT_IN_SERVICE_TEST:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_RPT_RESET:
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_alarm_entry_pack(bcmolt_epon_oam_ctc_alarm_entry *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_ctc_leaf_management_object_pack(this->object_type, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->object_instance))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_ctc_onu_alarm_id_pack(this->alarm_id, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->alarm_id)
    {
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_POWER_ALARM:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.onu_power_alarm.time_stamp))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_power_alarm.state))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_power_alarm_code_pack(this->u.onu_power_alarm.alarm_code, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_PON_IF_SWITCH:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.onu_pon_if_switch.time_stamp))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_pon_if_switch.state))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_pon_if_switch_code_pack(this->u.onu_pon_if_switch.alarm_code, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_CARD_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_CARD_SELF_TEST_FAILURE:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_E1LOS:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_E1PORT_FAILURE:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_E1TIMING_UNLOCK:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ETH_PORT_AUTO_NEG_FAILURE:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ETH_PORT_CONGESTION:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ETH_PORT_FAILURE:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ETH_PORT_LOOPBACK:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ETH_PORT_LOS:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_BATTERY_FAILURE:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_BATTERY_MISSING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_BATTERY_VOLT_LOW:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_EQUIPMENT_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_IAD_CONNECTION_FAILURE:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_PHYSICAL_INSTRUCTION_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_SELF_TEST_FAILURE:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_SLEEP_STATUS_UPDATE:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_TEMP_HIGH_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_TEMP_LOW_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_CRC_ERROR_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_CRC_ERROR_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_DISCARDS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_DISCARDS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_DROP_EVENTS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_DROP_EVERNTS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_ERRORS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_ERRORS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_FRAGMENTS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_FRAGMENTS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_JABBERS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_JABBERS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_OVERSIZE_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_OVERSIZE_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_UNDERSIZE_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_UNDERSIZE_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_RX_POWER_HIGH_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_RX_POWER_HIGH_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_RX_POWER_LOW_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_RX_POWER_LOW_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TEMP_HIGH_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TEMP_HIGH_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TEMP_LOW_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TEMP_LOW_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TX_BIAS_HIGH_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TX_BIAS_HIGH_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TX_BIAS_LOW_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TX_BIAS_LOW_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TX_POWER_HIGH_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TX_POWER_HIGH_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TX_POWER_LOW_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TX_POWER_LOW_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_CRC_ERROR_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_CRC_ERROR_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_DISCARDS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_DISCARDS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_DROP_EVENTS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_DROP_EVENTS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_ERROS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_ERROS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_FRAGMENTS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_FRAGMENTS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_JABBERS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_JABBERS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_OVERSIZE_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_OVERSIZE_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_UNDERSIZE_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_UNDERSIZE_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_VCC_HIGH_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_VCC_HIGH_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_VCC_LOW_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_VCC_LOW_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_CRC_ERROR_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_CRC_ERROR_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_DISCARDS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_DISCARDS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_DROP_EVENTS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_DROP_EVENTS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_ERRORS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_ERRORS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_FRAGMENTS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_FRAGMENTS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_JABBERS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_JABBERS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_OVERSIZE_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_OVERSIZE_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_UNDERSIZE_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_UNDERSIZE_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_STATUS_CHANGE_TIMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_STATUS_CHANGE_TIMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_CRC_ERROR_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_CRC_ERROR_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_DISCARDS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_DISCARDS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_DROP_EVENTS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_DROP_EVENTS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_ERRORS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_ERRORS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_FRAGMENTS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_FRAGMENTS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_JABBERS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_JABBERS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_OVERSIZE_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_OVERSIZE_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_UNDERSIZE_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_UNDERSIZE_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_POTS_PORT_FAILURE:
        default:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.def.time_stamp))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.def.state))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_alarm_entry_get_packed_length(bcmolt_epon_oam_ctc_alarm_entry *this)
{
    uint32_t count = 8;
    switch (this->alarm_id)
    {
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_POWER_ALARM:
            {
                count += 7;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_PON_IF_SWITCH:
            {
                count += 7;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_CARD_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_CARD_SELF_TEST_FAILURE:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_E1LOS:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_E1PORT_FAILURE:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_E1TIMING_UNLOCK:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ETH_PORT_AUTO_NEG_FAILURE:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ETH_PORT_CONGESTION:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ETH_PORT_FAILURE:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ETH_PORT_LOOPBACK:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ETH_PORT_LOS:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_BATTERY_FAILURE:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_BATTERY_MISSING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_BATTERY_VOLT_LOW:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_EQUIPMENT_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_IAD_CONNECTION_FAILURE:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_PHYSICAL_INSTRUCTION_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_SELF_TEST_FAILURE:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_SLEEP_STATUS_UPDATE:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_TEMP_HIGH_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_TEMP_LOW_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_CRC_ERROR_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_CRC_ERROR_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_DISCARDS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_DISCARDS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_DROP_EVENTS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_DROP_EVERNTS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_ERRORS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_ERRORS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_FRAGMENTS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_FRAGMENTS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_JABBERS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_JABBERS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_OVERSIZE_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_OVERSIZE_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_UNDERSIZE_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_UNDERSIZE_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_RX_POWER_HIGH_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_RX_POWER_HIGH_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_RX_POWER_LOW_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_RX_POWER_LOW_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TEMP_HIGH_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TEMP_HIGH_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TEMP_LOW_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TEMP_LOW_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TX_BIAS_HIGH_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TX_BIAS_HIGH_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TX_BIAS_LOW_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TX_BIAS_LOW_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TX_POWER_HIGH_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TX_POWER_HIGH_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TX_POWER_LOW_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TX_POWER_LOW_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_CRC_ERROR_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_CRC_ERROR_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_DISCARDS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_DISCARDS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_DROP_EVENTS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_DROP_EVENTS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_ERROS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_ERROS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_FRAGMENTS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_FRAGMENTS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_JABBERS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_JABBERS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_OVERSIZE_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_OVERSIZE_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_UNDERSIZE_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_UNDERSIZE_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_VCC_HIGH_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_VCC_HIGH_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_VCC_LOW_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_VCC_LOW_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_CRC_ERROR_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_CRC_ERROR_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_DISCARDS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_DISCARDS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_DROP_EVENTS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_DROP_EVENTS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_ERRORS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_ERRORS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_FRAGMENTS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_FRAGMENTS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_JABBERS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_JABBERS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_OVERSIZE_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_OVERSIZE_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_UNDERSIZE_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_UNDERSIZE_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_STATUS_CHANGE_TIMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_STATUS_CHANGE_TIMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_CRC_ERROR_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_CRC_ERROR_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_DISCARDS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_DISCARDS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_DROP_EVENTS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_DROP_EVENTS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_ERRORS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_ERRORS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_FRAGMENTS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_FRAGMENTS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_JABBERS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_JABBERS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_OVERSIZE_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_OVERSIZE_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_UNDERSIZE_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_UNDERSIZE_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_POTS_PORT_FAILURE:
        default:
            {
                count += 3;
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_alarm_entry_unpack(bcmolt_epon_oam_ctc_alarm_entry *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_ctc_leaf_management_object_unpack(&this->object_type, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->object_instance))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_ctc_onu_alarm_id_unpack(&this->alarm_id, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->alarm_id)
    {
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_POWER_ALARM:
            {
                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.onu_power_alarm.time_stamp))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.onu_power_alarm.state))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_power_alarm_code_unpack(&this->u.onu_power_alarm.alarm_code, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_PON_IF_SWITCH:
            {
                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.onu_pon_if_switch.time_stamp))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.onu_pon_if_switch.state))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_pon_if_switch_code_unpack(&this->u.onu_pon_if_switch.alarm_code, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_CARD_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_CARD_SELF_TEST_FAILURE:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_E1LOS:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_E1PORT_FAILURE:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_E1TIMING_UNLOCK:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ETH_PORT_AUTO_NEG_FAILURE:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ETH_PORT_CONGESTION:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ETH_PORT_FAILURE:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ETH_PORT_LOOPBACK:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ETH_PORT_LOS:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_BATTERY_FAILURE:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_BATTERY_MISSING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_BATTERY_VOLT_LOW:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_EQUIPMENT_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_IAD_CONNECTION_FAILURE:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_PHYSICAL_INSTRUCTION_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_SELF_TEST_FAILURE:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_SLEEP_STATUS_UPDATE:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_TEMP_HIGH_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_TEMP_LOW_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_CRC_ERROR_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_CRC_ERROR_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_DISCARDS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_DISCARDS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_DROP_EVENTS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_DROP_EVERNTS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_ERRORS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_ERRORS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_FRAGMENTS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_FRAGMENTS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_JABBERS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_JABBERS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_OVERSIZE_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_OVERSIZE_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_UNDERSIZE_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_UNDERSIZE_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_RX_POWER_HIGH_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_RX_POWER_HIGH_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_RX_POWER_LOW_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_RX_POWER_LOW_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TEMP_HIGH_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TEMP_HIGH_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TEMP_LOW_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TEMP_LOW_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TX_BIAS_HIGH_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TX_BIAS_HIGH_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TX_BIAS_LOW_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TX_BIAS_LOW_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TX_POWER_HIGH_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TX_POWER_HIGH_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TX_POWER_LOW_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TX_POWER_LOW_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_CRC_ERROR_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_CRC_ERROR_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_DISCARDS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_DISCARDS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_DROP_EVENTS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_DROP_EVENTS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_ERROS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_ERROS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_FRAGMENTS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_FRAGMENTS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_JABBERS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_JABBERS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_OVERSIZE_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_OVERSIZE_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_UNDERSIZE_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_UNDERSIZE_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_VCC_HIGH_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_VCC_HIGH_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_VCC_LOW_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_VCC_LOW_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_CRC_ERROR_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_CRC_ERROR_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_DISCARDS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_DISCARDS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_DROP_EVENTS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_DROP_EVENTS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_ERRORS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_ERRORS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_FRAGMENTS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_FRAGMENTS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_JABBERS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_JABBERS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_OVERSIZE_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_OVERSIZE_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_UNDERSIZE_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_UNDERSIZE_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_STATUS_CHANGE_TIMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_STATUS_CHANGE_TIMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_CRC_ERROR_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_CRC_ERROR_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_DISCARDS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_DISCARDS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_DROP_EVENTS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_DROP_EVENTS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_ERRORS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_ERRORS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_FRAGMENTS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_FRAGMENTS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_JABBERS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_JABBERS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_OVERSIZE_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_OVERSIZE_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_UNDERSIZE_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_UNDERSIZE_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_POTS_PORT_FAILURE:
        default:
            {
                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.def.time_stamp))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.def.state))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_alarm_entry_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_ctc_onu_alarm_id alarm_id;
    if (!bcmolt_epon_oam_buf_skip(packed, 2))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_ctc_onu_alarm_id_unpack(&alarm_id, packed))
    {
        return BCMOS_FALSE;
    }

    switch (alarm_id)
    {
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_POWER_ALARM:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_PON_IF_SWITCH:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_CARD_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_CARD_SELF_TEST_FAILURE:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_E1LOS:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_E1PORT_FAILURE:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_E1TIMING_UNLOCK:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ETH_PORT_AUTO_NEG_FAILURE:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ETH_PORT_CONGESTION:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ETH_PORT_FAILURE:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ETH_PORT_LOOPBACK:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ETH_PORT_LOS:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_BATTERY_FAILURE:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_BATTERY_MISSING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_BATTERY_VOLT_LOW:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_EQUIPMENT_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_IAD_CONNECTION_FAILURE:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_PHYSICAL_INSTRUCTION_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_SELF_TEST_FAILURE:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_SLEEP_STATUS_UPDATE:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_TEMP_HIGH_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_ONU_TEMP_LOW_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_CRC_ERROR_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_CRC_ERROR_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_DISCARDS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_DISCARDS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_DROP_EVENTS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_DROP_EVERNTS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_ERRORS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_ERRORS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_FRAGMENTS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_FRAGMENTS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_JABBERS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_JABBERS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_OVERSIZE_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_OVERSIZE_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_UNDERSIZE_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_DOWNSTREAM_UNDERSIZE_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_RX_POWER_HIGH_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_RX_POWER_HIGH_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_RX_POWER_LOW_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_RX_POWER_LOW_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TEMP_HIGH_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TEMP_HIGH_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TEMP_LOW_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TEMP_LOW_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TX_BIAS_HIGH_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TX_BIAS_HIGH_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TX_BIAS_LOW_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TX_BIAS_LOW_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TX_POWER_HIGH_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TX_POWER_HIGH_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TX_POWER_LOW_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_TX_POWER_LOW_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_CRC_ERROR_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_CRC_ERROR_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_DISCARDS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_DISCARDS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_DROP_EVENTS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_DROP_EVENTS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_ERROS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_ERROS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_FRAGMENTS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_FRAGMENTS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_JABBERS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_JABBERS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_OVERSIZE_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_OVERSIZE_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_UNDERSIZE_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_UPSTREAM_UNDERSIZE_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_VCC_HIGH_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_VCC_HIGH_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_VCC_LOW_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PON_IF_VCC_LOW_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_CRC_ERROR_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_CRC_ERROR_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_DISCARDS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_DISCARDS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_DROP_EVENTS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_DROP_EVENTS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_ERRORS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_ERRORS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_FRAGMENTS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_FRAGMENTS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_JABBERS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_JABBERS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_OVERSIZE_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_OVERSIZE_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_UNDERSIZE_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_DOWNSTREAM_UNDERSIZE_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_STATUS_CHANGE_TIMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_STATUS_CHANGE_TIMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_CRC_ERROR_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_CRC_ERROR_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_DISCARDS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_DISCARDS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_DROP_EVENTS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_DROP_EVENTS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_ERRORS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_ERRORS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_FRAGMENTS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_FRAGMENTS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_JABBERS_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_JABBERS_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_OVERSIZE_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_OVERSIZE_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_UNDERSIZE_FRAMES_ALARM:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_PORT_UPSTREAM_UNDERSIZE_FRAMES_WARNING:
        case BCMOLT_EPON_OAM_CTC_ONU_ALARM_ID_POTS_PORT_FAILURE:
        default:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_attribute_value_base_pack(bcmolt_epon_oam_ctc_attribute_value_base *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t preLenFieldPos;
    uint32_t bytesAfterLenField;
    if (!bcmolt_epon_oam_var_leaf_attribute_pack(this->leaf, buf))
    {
        return BCMOS_FALSE;
    }

    if (this->width >= 0x0080)
    {
        bcmolt_epon_oam_buf_write_u8(buf, this->width);
        return BCMOS_TRUE;
    }

    preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

    /* skip over length field (we'll fill it in later) */
    if (!bcmolt_epon_oam_buf_skip(buf, 1))
    {
        return BCMOS_FALSE;
    }

    switch (this->leaf)
    {
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_ADMIN_STATE:
            {
                if (!bcmolt_epon_oam_ctc_enabled_state_pack(this->u.phy_admin_state.state, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_ADMIN_STATE:
            {
                if (!bcmolt_epon_oam_ctc_enabled_state_pack(this->u.auto_neg_admin_state.state, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_LOCAL_TECH_ABILITY:
            {
                uint32_t i0;
                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.auto_neg_local_tech_ability.technologies_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.auto_neg_local_tech_ability.technologies_count > 0) && (this->u.auto_neg_local_tech_ability.technologies == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"technologies\" of struct \"bcmolt_epon_oam_ctc_attribute_value_base_auto_neg_local_tech_ability\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i0 = 0; i0 < this->u.auto_neg_local_tech_ability.technologies_count; i0++)
                {
                    if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.auto_neg_local_tech_ability.technologies[i0]))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_ADVERTISED_TECH_ABILITY:
            {
                uint32_t i1;
                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.auto_neg_advertised_tech_ability.technologies_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.auto_neg_advertised_tech_ability.technologies_count > 0) && (this->u.auto_neg_advertised_tech_ability.technologies == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"technologies\" of struct \"bcmolt_epon_oam_ctc_attribute_value_base_auto_neg_advertised_tech_ability\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i1 = 0; i1 < this->u.auto_neg_advertised_tech_ability.technologies_count; i1++)
                {
                    if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.auto_neg_advertised_tech_ability.technologies[i1]))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_FEC_ABILITY:
            {
                if (!bcmolt_epon_oam_ctc_fec_support_pack(this->u.fec_ability.support, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_FEC_MODE:
            {
                if (!bcmolt_epon_oam_ctc_fec_state_pack(this->u.fec_mode.state, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ACTOR_ADMIN_KEY:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ACTOR_OPER_KEY:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ACTOR_SYS_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ACTOR_SYS_PRI:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ADMIN_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_AGG_OR_INDIVIDUAL:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_BCAST_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_BCAST_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_COLLECTOR_MAX_DELAY:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_DATA_RATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_DESC:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_FRAMES_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_FRAMES_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_LINK_UP_DOWN_NOTIFY_EN:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_MAC_ADDR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_MCAST_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_MCAST_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_NAME:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_OPER_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_PARTNER_OPER_KEY:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_PARTNER_SYS_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_PARTNER_SYS_PRI:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_PORT_LIST:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_RX_DISCARD:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_RX_ERR_FRAMES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_RX_OCTETS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_TIME_OF_LAST_OPER_CHANGE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_TX_DISCARD:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_TX_ERR_FRAMES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_TX_OCTETS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_UNK_PROTOCOL:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_AD_SELECT_ABLE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_AUTO_CFG:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_LOCAL_SELECT_ABLE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_REMOTE_SIG:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_RX_SELECT_ABLE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_RX_TECH:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_FEC_CORRECTED_BLOCKS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_FEC_UNCORRECTABLE_BLOCKS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_GROUP_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_GROUP_PORT_CAPACITY:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_GROUP_PORT_MAP:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_ADDR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_ALIGN_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_BCAST_FRAMES_RX_OK:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_BCAST_FRAMES_TX_OK:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CAPABILITIES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CARRIER_SENSE_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_COLLISION_FRAMES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_FRAMES_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_FRAMES_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_FUNCS_SUPPORTED:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_PAUSE_DELAY:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_PAUSE_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_PAUSE_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_UNSUPPORTED_OP_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_DUPLEX_STATUS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_ENABLE_STATUS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_EXCESSIVE_COLLISIONS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FCS_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FR_EXCESSIVE_DEFERRAL:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAME_TOO_LONG:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAMES_DEFERRED:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAMES_LOST_MAC_RX_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAMES_LOST_MAC_TX_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAMES_RX_OK:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAMES_TX_OK:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_IN_RANGE_LEN_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_LATE_COLLISIONS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_MCAST_ADDR_LIST:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_MCAST_FRAMES_RX_OK:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_MCAST_FRAMES_TX_OK:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_MCAST_RX_STATUS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_MULTIPLE_COLL_FRAMES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_OCTETS_RX_OK:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_OCTETS_TX_OK:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_OUT_OF_RANGE_LEN_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_PROMISCUOUS_STATUS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_SINGLE_COLL_FRAMES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_TX_ENABLE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_ADMIN_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_BAND_SPLIT_FREQ:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_BAND_SPLIT_TYPE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_FALSE_CARRIERS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_IDLE_ERROR_COUNT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_JABBER:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_LOSE_MEDIA_CTR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_MEDIA_AVAIL:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_TYPE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_TYPE_LIST:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_DISCOVERY_TIMEOUT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_DISCOVERY_WINDOW_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_MAC_CTRL_FRAMES_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_MAC_CTRL_FRAMES_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_RX_GATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_RX_REG_ACK:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_RX_REG_REQUEST:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_RX_REGISTER:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_RX_REPORT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_TX_GATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_TX_REG_ACK:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_TX_REG_REQUEST:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_TX_REGISTER:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_TX_REPORT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_ADMIN_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_DUP_EVENT_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_EMUL_BAD_LLID_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_EMUL_CRC8ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_EMUL_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_EMUL_SPD_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_EVENT_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_FRAMES_LOST_OAM_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_INFO_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_INFO_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FR_SEC_SUM_EVENT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FR_SEC_SUM_THRESH:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FR_SEC_SUM_WIN:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_PERIOD_EVENT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_PERIOD_THRESH:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_PERIOD_WIN:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_SECS_EVENT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_SECS_THRESH:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_SECS_WIN:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_SYM_PERIOD_EVENT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_SYM_PERIOD_THRESH:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_SYM_PERIOD_WIN:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_FLAGS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOOP_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOOP_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_MODE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_ORG_SPECIFIC_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_ORG_SPECIFIC_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_PDU_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_PDU_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_CONFIG:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_PERIOD_EVENT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_PERIOD_THRESH:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_PERIOD_WIN:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_SECS_EVENT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_SECS_THRESH:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_SECS_WIN:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_FLAGS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_MAC_ADDR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_PDU_CONFIG:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_VENDOR_DEVICE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_VENDOR_OUI:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_VENDOR_VERSION:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_UNIQUE_EVENT_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_UNSUPPORTED_OPCODES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_VAR_REQ_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_VAR_REQ_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_VAR_RESP_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_VAR_RESP_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_MII_DETECT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_SQE_TEST_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_SYMBOL_ERR_DURING_CARRIER:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_TYPE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_TYPE_LIST:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_ADMIN_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_ALIGN_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_AUTO_PART_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_AUTO_PARTITIONS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_BURSTS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_COLLISIONS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_DATA_RATE_MISMATCHES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_FCS_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_FRAMES_TOO_LONG:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_ISOLATES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_LAST_SOURCE_ADDR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_LATE_EVENTS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_READABLE_FRAMES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_READABLE_OCTETS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_RUNTS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_SHORT_EVENTS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_SOURCE_ADDR_CHANGES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_SYM_ERR_DURING_PKT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_VERY_LONG_EVENTS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_GROUP_CAPACITY:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_GROUP_MAP:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_HEALTH_DATA:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_HEALTH_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_HEALTH_TEXT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_TX_COLLISIONS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_TYPE:
        default:
            {
            }
            break;
    }

    bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
    if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_attribute_value_base_get_packed_length(bcmolt_epon_oam_ctc_attribute_value_base *this)
{
    if (this->width >= 0x0080)
    {
        return this->width;
    }
    else
    {
        uint32_t count = 3;
        switch (this->leaf)
        {
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_ADMIN_STATE:
                {
                    count += 4;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_ADMIN_STATE:
                {
                    count += 4;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_LOCAL_TECH_ABILITY:
                {
                    count += 4 + (4 * this->u.auto_neg_local_tech_ability.technologies_count);
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_ADVERTISED_TECH_ABILITY:
                {
                    count += 4 + (4 * this->u.auto_neg_advertised_tech_ability.technologies_count);
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_FEC_ABILITY:
                {
                    count += 4;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_FEC_MODE:
                {
                    count += 4;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ACTOR_ADMIN_KEY:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ACTOR_OPER_KEY:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ACTOR_SYS_ID:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ACTOR_SYS_PRI:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ADMIN_STATE:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_AGG_OR_INDIVIDUAL:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_BCAST_RX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_BCAST_TX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_COLLECTOR_MAX_DELAY:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_DATA_RATE:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_DESC:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_FRAMES_RX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_FRAMES_TX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ID:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_LINK_UP_DOWN_NOTIFY_EN:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_MAC_ADDR:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_MCAST_RX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_MCAST_TX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_NAME:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_OPER_STATE:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_PARTNER_OPER_KEY:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_PARTNER_SYS_ID:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_PARTNER_SYS_PRI:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_PORT_LIST:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_RX_DISCARD:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_RX_ERR_FRAMES:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_RX_OCTETS:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_TIME_OF_LAST_OPER_CHANGE:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_TX_DISCARD:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_TX_ERR_FRAMES:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_TX_OCTETS:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_UNK_PROTOCOL:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_AD_SELECT_ABLE:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_AUTO_CFG:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_ID:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_LOCAL_SELECT_ABLE:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_REMOTE_SIG:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_RX_SELECT_ABLE:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_RX_TECH:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_FEC_CORRECTED_BLOCKS:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_FEC_UNCORRECTABLE_BLOCKS:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_GROUP_ID:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_GROUP_PORT_CAPACITY:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_GROUP_PORT_MAP:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_ADDR:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_ALIGN_ERR:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_BCAST_FRAMES_RX_OK:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_BCAST_FRAMES_TX_OK:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CAPABILITIES:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CARRIER_SENSE_ERR:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_COLLISION_FRAMES:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_FRAMES_RX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_FRAMES_TX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_FUNCS_SUPPORTED:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_ID:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_PAUSE_DELAY:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_PAUSE_RX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_PAUSE_TX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_UNSUPPORTED_OP_RX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_DUPLEX_STATUS:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_ENABLE_STATUS:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_EXCESSIVE_COLLISIONS:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FCS_ERR:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FR_EXCESSIVE_DEFERRAL:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAME_TOO_LONG:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAMES_DEFERRED:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAMES_LOST_MAC_RX_ERR:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAMES_LOST_MAC_TX_ERR:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAMES_RX_OK:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAMES_TX_OK:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_ID:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_IN_RANGE_LEN_ERR:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_LATE_COLLISIONS:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_MCAST_ADDR_LIST:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_MCAST_FRAMES_RX_OK:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_MCAST_FRAMES_TX_OK:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_MCAST_RX_STATUS:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_MULTIPLE_COLL_FRAMES:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_OCTETS_RX_OK:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_OCTETS_TX_OK:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_OUT_OF_RANGE_LEN_ERR:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_PROMISCUOUS_STATUS:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_SINGLE_COLL_FRAMES:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_TX_ENABLE:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_ADMIN_STATE:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_BAND_SPLIT_FREQ:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_BAND_SPLIT_TYPE:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_FALSE_CARRIERS:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_ID:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_IDLE_ERROR_COUNT:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_JABBER:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_LOSE_MEDIA_CTR:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_MEDIA_AVAIL:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_TYPE:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_TYPE_LIST:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_DISCOVERY_TIMEOUT:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_DISCOVERY_WINDOW_TX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_MAC_CTRL_FRAMES_RX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_MAC_CTRL_FRAMES_TX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_RX_GATE:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_RX_REG_ACK:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_RX_REG_REQUEST:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_RX_REGISTER:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_RX_REPORT:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_TX_GATE:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_TX_REG_ACK:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_TX_REG_REQUEST:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_TX_REGISTER:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_TX_REPORT:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_ADMIN_STATE:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_DUP_EVENT_RX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_EMUL_BAD_LLID_ERR:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_EMUL_CRC8ERR:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_EMUL_ID:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_EMUL_SPD_ERR:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_EVENT_TX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_FRAMES_LOST_OAM_ERR:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_ID:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_INFO_RX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_INFO_TX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FR_SEC_SUM_EVENT:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FR_SEC_SUM_THRESH:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FR_SEC_SUM_WIN:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_PERIOD_EVENT:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_PERIOD_THRESH:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_PERIOD_WIN:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_SECS_EVENT:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_SECS_THRESH:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_SECS_WIN:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_SYM_PERIOD_EVENT:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_SYM_PERIOD_THRESH:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_SYM_PERIOD_WIN:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_FLAGS:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOOP_RX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOOP_TX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_MODE:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_ORG_SPECIFIC_RX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_ORG_SPECIFIC_TX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_PDU_RX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_PDU_TX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_CONFIG:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_PERIOD_EVENT:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_PERIOD_THRESH:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_PERIOD_WIN:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_SECS_EVENT:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_SECS_THRESH:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_SECS_WIN:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_FLAGS:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_MAC_ADDR:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_PDU_CONFIG:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_STATE:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_VENDOR_DEVICE:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_VENDOR_OUI:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_VENDOR_VERSION:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_UNIQUE_EVENT_RX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_UNSUPPORTED_OPCODES:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_VAR_REQ_RX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_VAR_REQ_TX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_VAR_RESP_RX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_VAR_RESP_TX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_ID:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_MII_DETECT:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_SQE_TEST_ERR:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_SYMBOL_ERR_DURING_CARRIER:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_TYPE:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_TYPE_LIST:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_ADMIN_STATE:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_ALIGN_ERR:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_AUTO_PART_STATE:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_AUTO_PARTITIONS:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_BURSTS:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_COLLISIONS:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_DATA_RATE_MISMATCHES:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_FCS_ERR:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_FRAMES_TOO_LONG:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_ID:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_ISOLATES:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_LAST_SOURCE_ADDR:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_LATE_EVENTS:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_READABLE_FRAMES:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_READABLE_OCTETS:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_RUNTS:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_SHORT_EVENTS:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_SOURCE_ADDR_CHANGES:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_SYM_ERR_DURING_PKT:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_VERY_LONG_EVENTS:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_GROUP_CAPACITY:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_GROUP_MAP:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_HEALTH_DATA:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_HEALTH_STATE:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_HEALTH_TEXT:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_ID:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_TX_COLLISIONS:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_TYPE:
            default:
                {
                }
                break;
        }

        return count;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_attribute_value_base_unpack(bcmolt_epon_oam_ctc_attribute_value_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    bcmolt_epon_oam_buf postLenBuf;
    if (!bcmolt_epon_oam_var_leaf_attribute_unpack(&this->leaf, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->width))
    {
        return BCMOS_FALSE;
    }

    if (this->width >= 0x0080)
    {
        return BCMOS_TRUE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, (this->width == 0) ? 0x0080 : this->width, buf->curr);
    switch (this->leaf)
    {
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_ADMIN_STATE:
            {
                if (!bcmolt_epon_oam_ctc_enabled_state_unpack(&this->u.phy_admin_state.state, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_ADMIN_STATE:
            {
                if (!bcmolt_epon_oam_ctc_enabled_state_unpack(&this->u.auto_neg_admin_state.state, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_LOCAL_TECH_ABILITY:
            {
                uint32_t i0;
                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.auto_neg_local_tech_ability.technologies_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.auto_neg_local_tech_ability.technologies_count > 0) && (this->u.auto_neg_local_tech_ability.technologies == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"technologies\" of struct \"bcmolt_epon_oam_ctc_attribute_value_base_auto_neg_local_tech_ability\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.auto_neg_local_tech_ability.technologies = (uint32_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.auto_neg_local_tech_ability.technologies_count * sizeof(uint32_t));
                    }
                }

                for (i0 = 0; i0 < this->u.auto_neg_local_tech_ability.technologies_count; i0++)
                {
                    if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.auto_neg_local_tech_ability.technologies[i0]))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_ADVERTISED_TECH_ABILITY:
            {
                uint32_t i1;
                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.auto_neg_advertised_tech_ability.technologies_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.auto_neg_advertised_tech_ability.technologies_count > 0) && (this->u.auto_neg_advertised_tech_ability.technologies == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"technologies\" of struct \"bcmolt_epon_oam_ctc_attribute_value_base_auto_neg_advertised_tech_ability\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.auto_neg_advertised_tech_ability.technologies = (uint32_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.auto_neg_advertised_tech_ability.technologies_count * sizeof(uint32_t));
                    }
                }

                for (i1 = 0; i1 < this->u.auto_neg_advertised_tech_ability.technologies_count; i1++)
                {
                    if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.auto_neg_advertised_tech_ability.technologies[i1]))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_FEC_ABILITY:
            {
                if (!bcmolt_epon_oam_ctc_fec_support_unpack(&this->u.fec_ability.support, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_FEC_MODE:
            {
                if (!bcmolt_epon_oam_ctc_fec_state_unpack(&this->u.fec_mode.state, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ACTOR_ADMIN_KEY:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ACTOR_OPER_KEY:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ACTOR_SYS_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ACTOR_SYS_PRI:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ADMIN_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_AGG_OR_INDIVIDUAL:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_BCAST_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_BCAST_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_COLLECTOR_MAX_DELAY:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_DATA_RATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_DESC:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_FRAMES_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_FRAMES_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_LINK_UP_DOWN_NOTIFY_EN:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_MAC_ADDR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_MCAST_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_MCAST_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_NAME:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_OPER_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_PARTNER_OPER_KEY:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_PARTNER_SYS_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_PARTNER_SYS_PRI:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_PORT_LIST:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_RX_DISCARD:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_RX_ERR_FRAMES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_RX_OCTETS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_TIME_OF_LAST_OPER_CHANGE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_TX_DISCARD:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_TX_ERR_FRAMES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_TX_OCTETS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_UNK_PROTOCOL:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_AD_SELECT_ABLE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_AUTO_CFG:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_LOCAL_SELECT_ABLE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_REMOTE_SIG:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_RX_SELECT_ABLE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_RX_TECH:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_FEC_CORRECTED_BLOCKS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_FEC_UNCORRECTABLE_BLOCKS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_GROUP_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_GROUP_PORT_CAPACITY:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_GROUP_PORT_MAP:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_ADDR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_ALIGN_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_BCAST_FRAMES_RX_OK:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_BCAST_FRAMES_TX_OK:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CAPABILITIES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CARRIER_SENSE_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_COLLISION_FRAMES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_FRAMES_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_FRAMES_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_FUNCS_SUPPORTED:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_PAUSE_DELAY:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_PAUSE_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_PAUSE_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_UNSUPPORTED_OP_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_DUPLEX_STATUS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_ENABLE_STATUS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_EXCESSIVE_COLLISIONS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FCS_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FR_EXCESSIVE_DEFERRAL:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAME_TOO_LONG:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAMES_DEFERRED:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAMES_LOST_MAC_RX_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAMES_LOST_MAC_TX_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAMES_RX_OK:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAMES_TX_OK:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_IN_RANGE_LEN_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_LATE_COLLISIONS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_MCAST_ADDR_LIST:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_MCAST_FRAMES_RX_OK:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_MCAST_FRAMES_TX_OK:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_MCAST_RX_STATUS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_MULTIPLE_COLL_FRAMES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_OCTETS_RX_OK:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_OCTETS_TX_OK:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_OUT_OF_RANGE_LEN_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_PROMISCUOUS_STATUS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_SINGLE_COLL_FRAMES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_TX_ENABLE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_ADMIN_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_BAND_SPLIT_FREQ:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_BAND_SPLIT_TYPE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_FALSE_CARRIERS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_IDLE_ERROR_COUNT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_JABBER:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_LOSE_MEDIA_CTR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_MEDIA_AVAIL:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_TYPE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_TYPE_LIST:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_DISCOVERY_TIMEOUT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_DISCOVERY_WINDOW_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_MAC_CTRL_FRAMES_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_MAC_CTRL_FRAMES_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_RX_GATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_RX_REG_ACK:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_RX_REG_REQUEST:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_RX_REGISTER:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_RX_REPORT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_TX_GATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_TX_REG_ACK:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_TX_REG_REQUEST:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_TX_REGISTER:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_TX_REPORT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_ADMIN_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_DUP_EVENT_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_EMUL_BAD_LLID_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_EMUL_CRC8ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_EMUL_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_EMUL_SPD_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_EVENT_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_FRAMES_LOST_OAM_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_INFO_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_INFO_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FR_SEC_SUM_EVENT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FR_SEC_SUM_THRESH:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FR_SEC_SUM_WIN:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_PERIOD_EVENT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_PERIOD_THRESH:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_PERIOD_WIN:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_SECS_EVENT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_SECS_THRESH:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_SECS_WIN:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_SYM_PERIOD_EVENT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_SYM_PERIOD_THRESH:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_SYM_PERIOD_WIN:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_FLAGS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOOP_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOOP_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_MODE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_ORG_SPECIFIC_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_ORG_SPECIFIC_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_PDU_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_PDU_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_CONFIG:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_PERIOD_EVENT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_PERIOD_THRESH:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_PERIOD_WIN:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_SECS_EVENT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_SECS_THRESH:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_SECS_WIN:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_FLAGS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_MAC_ADDR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_PDU_CONFIG:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_VENDOR_DEVICE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_VENDOR_OUI:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_VENDOR_VERSION:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_UNIQUE_EVENT_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_UNSUPPORTED_OPCODES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_VAR_REQ_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_VAR_REQ_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_VAR_RESP_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_VAR_RESP_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_MII_DETECT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_SQE_TEST_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_SYMBOL_ERR_DURING_CARRIER:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_TYPE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_TYPE_LIST:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_ADMIN_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_ALIGN_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_AUTO_PART_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_AUTO_PARTITIONS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_BURSTS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_COLLISIONS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_DATA_RATE_MISMATCHES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_FCS_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_FRAMES_TOO_LONG:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_ISOLATES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_LAST_SOURCE_ADDR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_LATE_EVENTS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_READABLE_FRAMES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_READABLE_OCTETS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_RUNTS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_SHORT_EVENTS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_SOURCE_ADDR_CHANGES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_SYM_ERR_DURING_PKT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_VERY_LONG_EVENTS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_GROUP_CAPACITY:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_GROUP_MAP:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_HEALTH_DATA:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_HEALTH_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_HEALTH_TEXT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_TX_COLLISIONS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_TYPE:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(buf, (this->width == 0) ? 0x0080 : this->width))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_attribute_value_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_var_leaf_attribute leaf;
    bcmolt_epon_oam_buf postLenBuf;
    uint8_t length;
    if (!bcmolt_epon_oam_var_leaf_attribute_unpack(&leaf, packed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
    {
        return BCMOS_FALSE;
    }

    if (length >= 0x0080)
    {
        return BCMOS_TRUE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
    switch (leaf)
    {
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_ADMIN_STATE:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_ADMIN_STATE:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_LOCAL_TECH_ABILITY:
            {
                uint32_t technologies_count;
                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &technologies_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint32_t) * technologies_count);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, technologies_count * 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_ADVERTISED_TECH_ABILITY:
            {
                uint32_t technologies_count;
                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &technologies_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint32_t) * technologies_count);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, technologies_count * 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_FEC_ABILITY:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_FEC_MODE:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ACTOR_ADMIN_KEY:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ACTOR_OPER_KEY:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ACTOR_SYS_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ACTOR_SYS_PRI:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ADMIN_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_AGG_OR_INDIVIDUAL:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_BCAST_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_BCAST_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_COLLECTOR_MAX_DELAY:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_DATA_RATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_DESC:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_FRAMES_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_FRAMES_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_LINK_UP_DOWN_NOTIFY_EN:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_MAC_ADDR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_MCAST_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_MCAST_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_NAME:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_OPER_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_PARTNER_OPER_KEY:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_PARTNER_SYS_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_PARTNER_SYS_PRI:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_PORT_LIST:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_RX_DISCARD:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_RX_ERR_FRAMES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_RX_OCTETS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_TIME_OF_LAST_OPER_CHANGE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_TX_DISCARD:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_TX_ERR_FRAMES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_TX_OCTETS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_UNK_PROTOCOL:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_AD_SELECT_ABLE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_AUTO_CFG:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_LOCAL_SELECT_ABLE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_REMOTE_SIG:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_RX_SELECT_ABLE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_RX_TECH:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_FEC_CORRECTED_BLOCKS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_FEC_UNCORRECTABLE_BLOCKS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_GROUP_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_GROUP_PORT_CAPACITY:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_GROUP_PORT_MAP:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_ADDR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_ALIGN_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_BCAST_FRAMES_RX_OK:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_BCAST_FRAMES_TX_OK:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CAPABILITIES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CARRIER_SENSE_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_COLLISION_FRAMES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_FRAMES_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_FRAMES_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_FUNCS_SUPPORTED:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_PAUSE_DELAY:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_PAUSE_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_PAUSE_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_UNSUPPORTED_OP_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_DUPLEX_STATUS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_ENABLE_STATUS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_EXCESSIVE_COLLISIONS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FCS_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FR_EXCESSIVE_DEFERRAL:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAME_TOO_LONG:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAMES_DEFERRED:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAMES_LOST_MAC_RX_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAMES_LOST_MAC_TX_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAMES_RX_OK:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAMES_TX_OK:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_IN_RANGE_LEN_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_LATE_COLLISIONS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_MCAST_ADDR_LIST:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_MCAST_FRAMES_RX_OK:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_MCAST_FRAMES_TX_OK:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_MCAST_RX_STATUS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_MULTIPLE_COLL_FRAMES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_OCTETS_RX_OK:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_OCTETS_TX_OK:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_OUT_OF_RANGE_LEN_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_PROMISCUOUS_STATUS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_SINGLE_COLL_FRAMES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_TX_ENABLE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_ADMIN_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_BAND_SPLIT_FREQ:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_BAND_SPLIT_TYPE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_FALSE_CARRIERS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_IDLE_ERROR_COUNT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_JABBER:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_LOSE_MEDIA_CTR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_MEDIA_AVAIL:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_TYPE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_TYPE_LIST:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_DISCOVERY_TIMEOUT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_DISCOVERY_WINDOW_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_MAC_CTRL_FRAMES_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_MAC_CTRL_FRAMES_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_RX_GATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_RX_REG_ACK:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_RX_REG_REQUEST:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_RX_REGISTER:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_RX_REPORT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_TX_GATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_TX_REG_ACK:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_TX_REG_REQUEST:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_TX_REGISTER:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_TX_REPORT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_ADMIN_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_DUP_EVENT_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_EMUL_BAD_LLID_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_EMUL_CRC8ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_EMUL_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_EMUL_SPD_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_EVENT_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_FRAMES_LOST_OAM_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_INFO_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_INFO_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FR_SEC_SUM_EVENT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FR_SEC_SUM_THRESH:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FR_SEC_SUM_WIN:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_PERIOD_EVENT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_PERIOD_THRESH:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_PERIOD_WIN:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_SECS_EVENT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_SECS_THRESH:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_SECS_WIN:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_SYM_PERIOD_EVENT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_SYM_PERIOD_THRESH:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_SYM_PERIOD_WIN:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_FLAGS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOOP_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOOP_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_MODE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_ORG_SPECIFIC_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_ORG_SPECIFIC_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_PDU_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_PDU_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_CONFIG:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_PERIOD_EVENT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_PERIOD_THRESH:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_PERIOD_WIN:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_SECS_EVENT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_SECS_THRESH:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_SECS_WIN:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_FLAGS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_MAC_ADDR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_PDU_CONFIG:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_VENDOR_DEVICE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_VENDOR_OUI:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_VENDOR_VERSION:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_UNIQUE_EVENT_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_UNSUPPORTED_OPCODES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_VAR_REQ_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_VAR_REQ_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_VAR_RESP_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_VAR_RESP_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_MII_DETECT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_SQE_TEST_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_SYMBOL_ERR_DURING_CARRIER:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_TYPE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_TYPE_LIST:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_ADMIN_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_ALIGN_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_AUTO_PART_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_AUTO_PARTITIONS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_BURSTS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_COLLISIONS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_DATA_RATE_MISMATCHES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_FCS_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_FRAMES_TOO_LONG:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_ISOLATES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_LAST_SOURCE_ADDR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_LATE_EVENTS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_READABLE_FRAMES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_READABLE_OCTETS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_RUNTS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_SHORT_EVENTS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_SOURCE_ADDR_CHANGES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_SYM_ERR_DURING_PKT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_VERY_LONG_EVENTS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_GROUP_CAPACITY:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_GROUP_MAP:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_HEALTH_DATA:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_HEALTH_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_HEALTH_TEXT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_TX_COLLISIONS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_TYPE:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_churning_prov_base_pack(bcmolt_epon_oam_ctc_churning_prov_base *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_ctc_churning_op_code_pack(this->code, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->code)
    {
        case BCMOLT_EPON_OAM_CTC_CHURNING_OP_CODE_NEW_KEY_REQUEST:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.new_key_request.in_use_key_index))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_CHURNING_OP_CODE_NEW_CHURNING_KEY:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.new_churning_key.new_key_index))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.new_churning_key.churning_key0, 3))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.new_churning_key.churning_key1, 3))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.new_churning_key.churning_key2, 3))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_churning_prov_base_get_packed_length(bcmolt_epon_oam_ctc_churning_prov_base *this)
{
    uint32_t count = 1;
    switch (this->code)
    {
        case BCMOLT_EPON_OAM_CTC_CHURNING_OP_CODE_NEW_KEY_REQUEST:
            {
                count += 1;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_CHURNING_OP_CODE_NEW_CHURNING_KEY:
            {
                count += 10;
            }
            break;
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_churning_prov_base_unpack(bcmolt_epon_oam_ctc_churning_prov_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_ctc_churning_op_code_unpack(&this->code, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->code)
    {
        case BCMOLT_EPON_OAM_CTC_CHURNING_OP_CODE_NEW_KEY_REQUEST:
            {
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.new_key_request.in_use_key_index))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_CHURNING_OP_CODE_NEW_CHURNING_KEY:
            {
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.new_churning_key.new_key_index))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.new_churning_key.churning_key0, 3))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.new_churning_key.churning_key1, 3))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.new_churning_key.churning_key2, 3))
                {
                    /*Optional unpack fails do not cause errors */
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_churning_prov_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_ctc_churning_op_code code;
    if (!bcmolt_epon_oam_ctc_churning_op_code_unpack(&code, packed))
    {
        return BCMOS_FALSE;
    }

    switch (code)
    {
        case BCMOLT_EPON_OAM_CTC_CHURNING_OP_CODE_NEW_KEY_REQUEST:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_CHURNING_OP_CODE_NEW_CHURNING_KEY:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 3))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 3))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 3))
                {
                    /*Optional unpack fails do not cause errors */
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_commit_image_base_pack(bcmolt_epon_oam_ctc_commit_image_base *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_ctc_commit_image_opcode_pack(this->opcode, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->opcode)
    {
        case BCMOLT_EPON_OAM_CTC_COMMIT_IMAGE_OPCODE_COMMIT_IMAGE_REQUEST:
            {
                if (!bcmolt_epon_oam_ctc_commit_image_flag_pack(this->u.commit_image_request.flag, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_COMMIT_IMAGE_OPCODE_COMMIT_IMAGE_RESPONSE:
            {
                if (!bcmolt_epon_oam_ctc_commit_image_ack_pack(this->u.commit_image_response.ack, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_commit_image_base_get_packed_length(bcmolt_epon_oam_ctc_commit_image_base *this)
{
    uint32_t count = 2;
    switch (this->opcode)
    {
        case BCMOLT_EPON_OAM_CTC_COMMIT_IMAGE_OPCODE_COMMIT_IMAGE_REQUEST:
            {
                count += 1;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_COMMIT_IMAGE_OPCODE_COMMIT_IMAGE_RESPONSE:
            {
                count += 1;
            }
            break;
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_commit_image_base_unpack(bcmolt_epon_oam_ctc_commit_image_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_ctc_commit_image_opcode_unpack(&this->opcode, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->opcode)
    {
        case BCMOLT_EPON_OAM_CTC_COMMIT_IMAGE_OPCODE_COMMIT_IMAGE_REQUEST:
            {
                if (!bcmolt_epon_oam_ctc_commit_image_flag_unpack(&this->u.commit_image_request.flag, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_COMMIT_IMAGE_OPCODE_COMMIT_IMAGE_RESPONSE:
            {
                if (!bcmolt_epon_oam_ctc_commit_image_ack_unpack(&this->u.commit_image_response.ack, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_commit_image_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_ctc_commit_image_opcode opcode;
    if (!bcmolt_epon_oam_ctc_commit_image_opcode_unpack(&opcode, packed))
    {
        return BCMOS_FALSE;
    }

    switch (opcode)
    {
        case BCMOLT_EPON_OAM_CTC_COMMIT_IMAGE_OPCODE_COMMIT_IMAGE_REQUEST:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_COMMIT_IMAGE_OPCODE_COMMIT_IMAGE_RESPONSE:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_dba_queue_set_pack(bcmolt_epon_oam_ctc_dba_queue_set *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u8(buf, this->report_bitmap))
    {
        return BCMOS_FALSE;
    }

    if ((((uint64_t) this->report_bitmap & 0x0001) == 0x0001))
    {
        if (!bcmolt_epon_oam_buf_write_u16(buf, this->queue0))
        {
            return BCMOS_FALSE;
        }
    }

    if ((((uint64_t) this->report_bitmap & 0x0002) == 0x0002))
    {
        if (!bcmolt_epon_oam_buf_write_u16(buf, this->queue1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((((uint64_t) this->report_bitmap & 0x0004) == 0x0004))
    {
        if (!bcmolt_epon_oam_buf_write_u16(buf, this->queue2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((((uint64_t) this->report_bitmap & 0x0008) == 0x0008))
    {
        if (!bcmolt_epon_oam_buf_write_u16(buf, this->queue3))
        {
            return BCMOS_FALSE;
        }
    }

    if ((((uint64_t) this->report_bitmap & 0x0010) == 0x0010))
    {
        if (!bcmolt_epon_oam_buf_write_u16(buf, this->queue4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((((uint64_t) this->report_bitmap & 0x0020) == 0x0020))
    {
        if (!bcmolt_epon_oam_buf_write_u16(buf, this->queue5))
        {
            return BCMOS_FALSE;
        }
    }

    if ((((uint64_t) this->report_bitmap & 0x0040) == 0x0040))
    {
        if (!bcmolt_epon_oam_buf_write_u16(buf, this->queue6))
        {
            return BCMOS_FALSE;
        }
    }

    if ((((uint64_t) this->report_bitmap & 0x0080) == 0x0080))
    {
        if (!bcmolt_epon_oam_buf_write_u16(buf, this->queue7))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_dba_queue_set_unpack(bcmolt_epon_oam_ctc_dba_queue_set *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->report_bitmap))
    {
        return BCMOS_FALSE;
    }

    if ((((uint64_t) this->report_bitmap & 0x0001) == 0x0001))
    {
        if (!bcmolt_epon_oam_buf_read_u16(buf, &this->queue0))
        {
            return BCMOS_FALSE;
        }
    }

    if ((((uint64_t) this->report_bitmap & 0x0002) == 0x0002))
    {
        if (!bcmolt_epon_oam_buf_read_u16(buf, &this->queue1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((((uint64_t) this->report_bitmap & 0x0004) == 0x0004))
    {
        if (!bcmolt_epon_oam_buf_read_u16(buf, &this->queue2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((((uint64_t) this->report_bitmap & 0x0008) == 0x0008))
    {
        if (!bcmolt_epon_oam_buf_read_u16(buf, &this->queue3))
        {
            return BCMOS_FALSE;
        }
    }

    if ((((uint64_t) this->report_bitmap & 0x0010) == 0x0010))
    {
        if (!bcmolt_epon_oam_buf_read_u16(buf, &this->queue4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((((uint64_t) this->report_bitmap & 0x0020) == 0x0020))
    {
        if (!bcmolt_epon_oam_buf_read_u16(buf, &this->queue5))
        {
            return BCMOS_FALSE;
        }
    }

    if ((((uint64_t) this->report_bitmap & 0x0040) == 0x0040))
    {
        if (!bcmolt_epon_oam_buf_read_u16(buf, &this->queue6))
        {
            return BCMOS_FALSE;
        }
    }

    if ((((uint64_t) this->report_bitmap & 0x0080) == 0x0080))
    {
        if (!bcmolt_epon_oam_buf_read_u16(buf, &this->queue7))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_dba_queue_set_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 17);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_dba_prov_base_pack(bcmolt_epon_oam_ctc_dba_prov_base *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_ctc_dba_op_code_pack(this->dba_code, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->dba_code)
    {
        case BCMOLT_EPON_OAM_CTC_DBA_OP_CODE_GET_REQUEST:
            {
            }
            break;
        case BCMOLT_EPON_OAM_CTC_DBA_OP_CODE_GET_RESPONSE:
            {
                uint8_t i0;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.get_response.queue_sets_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_response.queue_sets_count > 0) && (this->u.get_response.queue_sets == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"queue_sets\" of struct \"bcmolt_epon_oam_ctc_dba_prov_base_get_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i0 = 0; i0 < this->u.get_response.queue_sets_count; i0++)
                {
                    if (!bcmolt_epon_oam_ctc_dba_queue_set_pack(&this->u.get_response.queue_sets[i0], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_DBA_OP_CODE_SET_REQUEST:
            {
                uint8_t i1;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.set_request.queue_sets_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.set_request.queue_sets_count > 0) && (this->u.set_request.queue_sets == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"queue_sets\" of struct \"bcmolt_epon_oam_ctc_dba_prov_base_set_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i1 = 0; i1 < this->u.set_request.queue_sets_count; i1++)
                {
                    if (!bcmolt_epon_oam_ctc_dba_queue_set_pack(&this->u.set_request.queue_sets[i1], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_DBA_OP_CODE_SET_RESPONSE:
            {
                uint8_t i2;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.set_response.queue_sets_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.set_response.queue_sets_count > 0) && (this->u.set_response.queue_sets == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"queue_sets\" of struct \"bcmolt_epon_oam_ctc_dba_prov_base_set_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i2 = 0; i2 < this->u.set_response.queue_sets_count; i2++)
                {
                    if (!bcmolt_epon_oam_ctc_dba_queue_set_pack(&this->u.set_response.queue_sets[i2], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_dba_prov_base_get_packed_length(bcmolt_epon_oam_ctc_dba_prov_base *this)
{
    uint32_t count = 1;
    switch (this->dba_code)
    {
        case BCMOLT_EPON_OAM_CTC_DBA_OP_CODE_GET_REQUEST:
            {
            }
            break;
        case BCMOLT_EPON_OAM_CTC_DBA_OP_CODE_GET_RESPONSE:
            {
                uint32_t i0;
                count += 1;
                if ((this->u.get_response.queue_sets_count > 0) && (this->u.get_response.queue_sets == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"queue_sets_count\" of struct \"bcmolt_epon_oam_ctc_dba_prov_base\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return 0;
                }

                for (i0 = 0; i0 < this->u.get_response.queue_sets_count; i0++)
                {
                    count += 17;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_DBA_OP_CODE_SET_REQUEST:
            {
                uint32_t i1;
                count += 1;
                if ((this->u.set_request.queue_sets_count > 0) && (this->u.set_request.queue_sets == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"queue_sets_count\" of struct \"bcmolt_epon_oam_ctc_dba_prov_base\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return 0;
                }

                for (i1 = 0; i1 < this->u.set_request.queue_sets_count; i1++)
                {
                    count += 17;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_DBA_OP_CODE_SET_RESPONSE:
            {
                uint32_t i2;
                count += 1;
                if ((this->u.set_response.queue_sets_count > 0) && (this->u.set_response.queue_sets == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"queue_sets_count\" of struct \"bcmolt_epon_oam_ctc_dba_prov_base\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return 0;
                }

                for (i2 = 0; i2 < this->u.set_response.queue_sets_count; i2++)
                {
                    count += 17;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_dba_prov_base_unpack(bcmolt_epon_oam_ctc_dba_prov_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_ctc_dba_op_code_unpack(&this->dba_code, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->dba_code)
    {
        case BCMOLT_EPON_OAM_CTC_DBA_OP_CODE_GET_REQUEST:
            {
            }
            break;
        case BCMOLT_EPON_OAM_CTC_DBA_OP_CODE_GET_RESPONSE:
            {
                uint8_t i0;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.get_response.queue_sets_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_response.queue_sets_count > 0) && (this->u.get_response.queue_sets == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"queue_sets\" of struct \"bcmolt_epon_oam_ctc_dba_prov_base_get_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.get_response.queue_sets = (bcmolt_epon_oam_ctc_dba_queue_set *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.get_response.queue_sets_count * sizeof(bcmolt_epon_oam_ctc_dba_queue_set));
                    }
                }

                for (i0 = 0; i0 < this->u.get_response.queue_sets_count; i0++)
                {
                    if (!bcmolt_epon_oam_ctc_dba_queue_set_unpack(&this->u.get_response.queue_sets[i0], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_DBA_OP_CODE_SET_REQUEST:
            {
                uint8_t i1;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.set_request.queue_sets_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.set_request.queue_sets_count > 0) && (this->u.set_request.queue_sets == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"queue_sets\" of struct \"bcmolt_epon_oam_ctc_dba_prov_base_set_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.set_request.queue_sets = (bcmolt_epon_oam_ctc_dba_queue_set *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.set_request.queue_sets_count * sizeof(bcmolt_epon_oam_ctc_dba_queue_set));
                    }
                }

                for (i1 = 0; i1 < this->u.set_request.queue_sets_count; i1++)
                {
                    if (!bcmolt_epon_oam_ctc_dba_queue_set_unpack(&this->u.set_request.queue_sets[i1], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_DBA_OP_CODE_SET_RESPONSE:
            {
                uint8_t i2;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.set_response.queue_sets_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.set_response.queue_sets_count > 0) && (this->u.set_response.queue_sets == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"queue_sets\" of struct \"bcmolt_epon_oam_ctc_dba_prov_base_set_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.set_response.queue_sets = (bcmolt_epon_oam_ctc_dba_queue_set *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.set_response.queue_sets_count * sizeof(bcmolt_epon_oam_ctc_dba_queue_set));
                    }
                }

                for (i2 = 0; i2 < this->u.set_response.queue_sets_count; i2++)
                {
                    if (!bcmolt_epon_oam_ctc_dba_queue_set_unpack(&this->u.set_response.queue_sets[i2], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_dba_prov_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_ctc_dba_op_code dba_code;
    if (!bcmolt_epon_oam_ctc_dba_op_code_unpack(&dba_code, packed))
    {
        return BCMOS_FALSE;
    }

    switch (dba_code)
    {
        case BCMOLT_EPON_OAM_CTC_DBA_OP_CODE_GET_REQUEST:
            {
            }
            break;
        case BCMOLT_EPON_OAM_CTC_DBA_OP_CODE_GET_RESPONSE:
            {
                uint8_t queue_sets_count;
                uint8_t i0;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &queue_sets_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_ctc_dba_queue_set) * queue_sets_count);
                for (i0 = 0; i0 < queue_sets_count; i0++)
                {
                    if (!bcmolt_epon_oam_ctc_dba_queue_set_scan(packed, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_DBA_OP_CODE_SET_REQUEST:
            {
                uint8_t queue_sets_count;
                uint8_t i1;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &queue_sets_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_ctc_dba_queue_set) * queue_sets_count);
                for (i1 = 0; i1 < queue_sets_count; i1++)
                {
                    if (!bcmolt_epon_oam_ctc_dba_queue_set_scan(packed, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_DBA_OP_CODE_SET_RESPONSE:
            {
                uint8_t queue_sets_count;
                uint8_t i2;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &queue_sets_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_ctc_dba_queue_set) * queue_sets_count);
                for (i2 = 0; i2 < queue_sets_count; i2++)
                {
                    if (!bcmolt_epon_oam_ctc_dba_queue_set_scan(packed, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_old_management_object_base_pack(bcmolt_epon_oam_ctc_old_management_object_base *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t preLenFieldPos;
    uint32_t bytesAfterLenField;
    if (!bcmolt_epon_oam_ctc_leaf_old_management_object_pack(this->leaf, buf))
    {
        return BCMOS_FALSE;
    }

    if (this->length >= 0x0080)
    {
        bcmolt_epon_oam_buf_write_u8(buf, this->length);
        return BCMOS_TRUE;
    }

    preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

    /* skip over length field (we'll fill it in later) */
    if (!bcmolt_epon_oam_buf_skip(buf, 1))
    {
        return BCMOS_FALSE;
    }

    switch (this->leaf)
    {
        case BCMOLT_EPON_OAM_CTC_LEAF_OLD_MANAGEMENT_OBJECT_PORT:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.port.port))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
    if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_old_management_object_base_get_packed_length(bcmolt_epon_oam_ctc_old_management_object_base *this)
{
    if (this->length >= 0x0080)
    {
        return this->length;
    }
    else
    {
        uint32_t count = 3;
        switch (this->leaf)
        {
            case BCMOLT_EPON_OAM_CTC_LEAF_OLD_MANAGEMENT_OBJECT_PORT:
                {
                    count += 1;
                }
                break;
            default:
                {
                }
                break;
        }

        return count;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_old_management_object_base_unpack(bcmolt_epon_oam_ctc_old_management_object_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    bcmolt_epon_oam_buf postLenBuf;
    if (!bcmolt_epon_oam_ctc_leaf_old_management_object_unpack(&this->leaf, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->length))
    {
        return BCMOS_FALSE;
    }

    if (this->length >= 0x0080)
    {
        return BCMOS_TRUE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, (this->length == 0) ? 0x0080 : this->length, buf->curr);
    switch (this->leaf)
    {
        case BCMOLT_EPON_OAM_CTC_LEAF_OLD_MANAGEMENT_OBJECT_PORT:
            {
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.port.port))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(buf, (this->length == 0) ? 0x0080 : this->length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_old_management_object_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_ctc_leaf_old_management_object leaf;
    bcmolt_epon_oam_buf postLenBuf;
    uint8_t length;
    if (!bcmolt_epon_oam_ctc_leaf_old_management_object_unpack(&leaf, packed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
    {
        return BCMOS_FALSE;
    }

    if (length >= 0x0080)
    {
        return BCMOS_TRUE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
    switch (leaf)
    {
        case BCMOLT_EPON_OAM_CTC_LEAF_OLD_MANAGEMENT_OBJECT_PORT:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_management_object_base_pack(bcmolt_epon_oam_ctc_management_object_base *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t preLenFieldPos;
    uint32_t bytesAfterLenField;
    if (!bcmolt_epon_oam_ctc_leaf_management_object_pack(this->leaf, buf))
    {
        return BCMOS_FALSE;
    }

    if (this->length >= 0x0080)
    {
        bcmolt_epon_oam_buf_write_u8(buf, this->length);
        return BCMOS_TRUE;
    }

    preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

    /* skip over length field (we'll fill it in later) */
    if (!bcmolt_epon_oam_buf_skip(buf, 1))
    {
        return BCMOS_FALSE;
    }

    switch (this->leaf)
    {
        case BCMOLT_EPON_OAM_CTC_LEAF_MANAGEMENT_OBJECT_PORT:
            {
                if (!bcmolt_epon_oam_ctc_port_type_pack(this->u.port.port_type, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.port.cascade_slot_number))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.port.port_number))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_MANAGEMENT_OBJECT_CARD:
            {
                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.card.card))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_MANAGEMENT_OBJECT_LLID:
            {
                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.llid.llid))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_MANAGEMENT_OBJECT_PON_IF:
            {
                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.pon_if.pon_if))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_MANAGEMENT_OBJECT_ONU:
        default:
            {
            }
            break;
    }

    bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
    if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_management_object_base_get_packed_length(bcmolt_epon_oam_ctc_management_object_base *this)
{
    if (this->length >= 0x0080)
    {
        return this->length;
    }
    else
    {
        uint32_t count = 3;
        switch (this->leaf)
        {
            case BCMOLT_EPON_OAM_CTC_LEAF_MANAGEMENT_OBJECT_PORT:
                {
                    count += 4;
                }
                break;
            case BCMOLT_EPON_OAM_CTC_LEAF_MANAGEMENT_OBJECT_CARD:
                {
                    count += 4;
                }
                break;
            case BCMOLT_EPON_OAM_CTC_LEAF_MANAGEMENT_OBJECT_LLID:
                {
                    count += 4;
                }
                break;
            case BCMOLT_EPON_OAM_CTC_LEAF_MANAGEMENT_OBJECT_PON_IF:
                {
                    count += 4;
                }
                break;
            case BCMOLT_EPON_OAM_CTC_LEAF_MANAGEMENT_OBJECT_ONU:
            default:
                {
                }
                break;
        }

        return count;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_management_object_base_unpack(bcmolt_epon_oam_ctc_management_object_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    bcmolt_epon_oam_buf postLenBuf;
    if (!bcmolt_epon_oam_ctc_leaf_management_object_unpack(&this->leaf, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->length))
    {
        return BCMOS_FALSE;
    }

    if (this->length >= 0x0080)
    {
        return BCMOS_TRUE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, (this->length == 0) ? 0x0080 : this->length, buf->curr);
    switch (this->leaf)
    {
        case BCMOLT_EPON_OAM_CTC_LEAF_MANAGEMENT_OBJECT_PORT:
            {
                if (!bcmolt_epon_oam_ctc_port_type_unpack(&this->u.port.port_type, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.port.cascade_slot_number))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.port.port_number))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_MANAGEMENT_OBJECT_CARD:
            {
                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.card.card))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_MANAGEMENT_OBJECT_LLID:
            {
                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.llid.llid))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_MANAGEMENT_OBJECT_PON_IF:
            {
                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.pon_if.pon_if))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_MANAGEMENT_OBJECT_ONU:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(buf, (this->length == 0) ? 0x0080 : this->length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_management_object_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_ctc_leaf_management_object leaf;
    bcmolt_epon_oam_buf postLenBuf;
    uint8_t length;
    if (!bcmolt_epon_oam_ctc_leaf_management_object_unpack(&leaf, packed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
    {
        return BCMOS_FALSE;
    }

    if (length >= 0x0080)
    {
        return BCMOS_TRUE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
    switch (leaf)
    {
        case BCMOLT_EPON_OAM_CTC_LEAF_MANAGEMENT_OBJECT_PORT:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_MANAGEMENT_OBJECT_CARD:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_MANAGEMENT_OBJECT_LLID:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_MANAGEMENT_OBJECT_PON_IF:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_MANAGEMENT_OBJECT_ONU:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_empty_var_container_base_pack(bcmolt_epon_oam_ctc_empty_var_container_base *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_ctc_branch_pack(this->branch, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->branch)
    {
        case BCMOLT_EPON_OAM_CTC_BRANCH_END:
            {
                if ((this->u.end.unknown_count > 0) && (this->u.end.unknown == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"unknown\" of struct \"bcmolt_epon_oam_ctc_empty_var_container_base_end\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.end.unknown, this->u.end.unknown_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_var_leaf_attribute_pack(this->u.attribute.leaf, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_oam_error_code_pack(this->u.attribute.error, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_ACTION:
            {
                if (!bcmolt_epon_oam_var_leaf_action_pack(this->u.action.leaf, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_oam_error_code_pack(this->u.action.error, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_OLD_MANAGEMENT_OBJECT:
            {
                if (!bcmolt_epon_oam_ctc_old_management_object_base_pack(&this->u.old_management_object.object, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_MANAGEMENT_OBJECT:
            {
                if (!bcmolt_epon_oam_ctc_management_object_base_pack(&this->u.management_object.object, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_EXT_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_ctc_leaf_ext_attribute_pack(this->u.ext_attribute.leaf, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_oam_error_code_pack(this->u.ext_attribute.error, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_EXT_ACTION:
            {
                if (!bcmolt_epon_oam_ctc_leaf_ext_action_pack(this->u.ext_action.leaf, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_oam_error_code_pack(this->u.ext_action.error, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_KTATTRIBUTE:
            {
                if (!bcmolt_epon_oam_ktleaf_attribute_pack(this->u.ktattribute.leaf, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_oam_error_code_pack(this->u.ktattribute.error, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_KTACTION:
            {
                if (!bcmolt_epon_oam_ktleaf_attribute_pack(this->u.ktaction.leaf, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_oam_error_code_pack(this->u.ktaction.error, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.def.leaf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_oam_error_code_pack(this->u.def.error, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_empty_var_container_base_get_packed_length(bcmolt_epon_oam_ctc_empty_var_container_base *this)
{
    uint32_t count = 1;
    switch (this->branch)
    {
        case BCMOLT_EPON_OAM_CTC_BRANCH_END:
            {
                count += this->u.end.unknown_count;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_ATTRIBUTE:
            {
                count += 3;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_ACTION:
            {
                count += 3;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_OLD_MANAGEMENT_OBJECT:
            {
                count += bcmolt_epon_oam_ctc_old_management_object_base_get_packed_length(&this->u.old_management_object.object);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_MANAGEMENT_OBJECT:
            {
                count += bcmolt_epon_oam_ctc_management_object_base_get_packed_length(&this->u.management_object.object);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_EXT_ATTRIBUTE:
            {
                count += 3;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_EXT_ACTION:
            {
                count += 3;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_KTATTRIBUTE:
            {
                count += 3;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_KTACTION:
            {
                count += 3;
            }
            break;
        default:
            {
                count += 3;
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_empty_var_container_base_unpack(bcmolt_epon_oam_ctc_empty_var_container_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_ctc_branch_unpack(&this->branch, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->branch)
    {
        case BCMOLT_EPON_OAM_CTC_BRANCH_END:
            {
                this->u.end.unknown_count = bcmolt_epon_oam_ctc_empty_var_container_base_end_count_unknown(buf);
                if ((this->u.end.unknown_count > 0) && (this->u.end.unknown == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"unknown\" of struct \"bcmolt_epon_oam_ctc_empty_var_container_base_end\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.end.unknown = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.end.unknown_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.end.unknown, this->u.end.unknown_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_var_leaf_attribute_unpack(&this->u.attribute.leaf, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_oam_error_code_unpack(&this->u.attribute.error, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_ACTION:
            {
                if (!bcmolt_epon_oam_var_leaf_action_unpack(&this->u.action.leaf, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_oam_error_code_unpack(&this->u.action.error, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_OLD_MANAGEMENT_OBJECT:
            {
                if (!bcmolt_epon_oam_ctc_old_management_object_base_unpack(&this->u.old_management_object.object, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_MANAGEMENT_OBJECT:
            {
                if (!bcmolt_epon_oam_ctc_management_object_base_unpack(&this->u.management_object.object, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_EXT_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_ctc_leaf_ext_attribute_unpack(&this->u.ext_attribute.leaf, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_oam_error_code_unpack(&this->u.ext_attribute.error, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_EXT_ACTION:
            {
                if (!bcmolt_epon_oam_ctc_leaf_ext_action_unpack(&this->u.ext_action.leaf, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_oam_error_code_unpack(&this->u.ext_action.error, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_KTATTRIBUTE:
            {
                if (!bcmolt_epon_oam_ktleaf_attribute_unpack(&this->u.ktattribute.leaf, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_oam_error_code_unpack(&this->u.ktattribute.error, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_KTACTION:
            {
                if (!bcmolt_epon_oam_ktleaf_attribute_unpack(&this->u.ktaction.leaf, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_oam_error_code_unpack(&this->u.ktaction.error, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.def.leaf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_oam_error_code_unpack(&this->u.def.error, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_empty_var_container_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_ctc_branch branch;
    if (!bcmolt_epon_oam_ctc_branch_unpack(&branch, packed))
    {
        return BCMOS_FALSE;
    }

    switch (branch)
    {
        case BCMOLT_EPON_OAM_CTC_BRANCH_END:
            {
                uint32_t unknown_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(packed, 1))
                    {
                        break;
                    }

                    unknown_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(unknown_elem_count * sizeof(uint8_t));
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_ACTION:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_OLD_MANAGEMENT_OBJECT:
            {
                if (!bcmolt_epon_oam_ctc_old_management_object_base_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_MANAGEMENT_OBJECT:
            {
                if (!bcmolt_epon_oam_ctc_management_object_base_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_EXT_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_EXT_ACTION:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_KTATTRIBUTE:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_KTACTION:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_empty_var_container_base_end_count_unknown(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_eth_port_policing_config_base_pack(bcmolt_epon_oam_ctc_eth_port_policing_config_base *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_ctc_eth_port_policing_enable_pack(this->state, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->state)
    {
        case BCMOLT_EPON_OAM_CTC_ETH_PORT_POLICING_ENABLE_DISABLED:
            {
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ETH_PORT_POLICING_ENABLE_ENABLED:
            {
                if (!bcmolt_epon_oam_buf_write_u24(buf, this->u.enabled.cir))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u24(buf, this->u.enabled.bucket))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u24(buf, this->u.enabled.extra_burst))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
                if ((this->u.def.unknown_count > 0) && (this->u.def.unknown == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"unknown\" of struct \"bcmolt_epon_oam_ctc_eth_port_policing_config_base_def\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.def.unknown, this->u.def.unknown_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_eth_port_policing_config_base_get_packed_length(bcmolt_epon_oam_ctc_eth_port_policing_config_base *this)
{
    uint32_t count = 1;
    switch (this->state)
    {
        case BCMOLT_EPON_OAM_CTC_ETH_PORT_POLICING_ENABLE_DISABLED:
            {
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ETH_PORT_POLICING_ENABLE_ENABLED:
            {
                count += 9;
            }
            break;
        default:
            {
                count += this->u.def.unknown_count;
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_eth_port_policing_config_base_unpack(bcmolt_epon_oam_ctc_eth_port_policing_config_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_ctc_eth_port_policing_enable_unpack(&this->state, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->state)
    {
        case BCMOLT_EPON_OAM_CTC_ETH_PORT_POLICING_ENABLE_DISABLED:
            {
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ETH_PORT_POLICING_ENABLE_ENABLED:
            {
                if (!bcmolt_epon_oam_buf_read_u24(buf, &this->u.enabled.cir))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u24(buf, &this->u.enabled.bucket))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u24(buf, &this->u.enabled.extra_burst))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
                this->u.def.unknown_count = bcmolt_epon_oam_ctc_eth_port_policing_config_base_def_count_unknown(buf);
                if ((this->u.def.unknown_count > 0) && (this->u.def.unknown == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"unknown\" of struct \"bcmolt_epon_oam_ctc_eth_port_policing_config_base_def\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.def.unknown = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.def.unknown_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.def.unknown, this->u.def.unknown_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_eth_port_policing_config_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_ctc_eth_port_policing_enable state;
    if (!bcmolt_epon_oam_ctc_eth_port_policing_enable_unpack(&state, packed))
    {
        return BCMOS_FALSE;
    }

    switch (state)
    {
        case BCMOLT_EPON_OAM_CTC_ETH_PORT_POLICING_ENABLE_DISABLED:
            {
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ETH_PORT_POLICING_ENABLE_ENABLED:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 3))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 3))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 3))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
                uint32_t unknown_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(packed, 1))
                    {
                        break;
                    }

                    unknown_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(unknown_elem_count * sizeof(uint8_t));
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_eth_port_policing_config_base_def_count_unknown(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_event_entry_pack(bcmolt_epon_oam_ctc_event_entry *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_ctc_leaf_management_object_pack(this->object_type, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->object_instance))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_ctc_onu_alarm_id_pack(this->alarm_id, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_event_entry_unpack(bcmolt_epon_oam_ctc_event_entry *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_ctc_leaf_management_object_unpack(&this->object_type, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->object_instance))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_ctc_onu_alarm_id_unpack(&this->alarm_id, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_event_entry_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 8);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_event_status_entry_pack(bcmolt_epon_oam_ctc_event_status_entry *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_ctc_event_entry_pack(&this->event_entry, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_ctc_event_status_pack(this->event_status, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_event_status_entry_unpack(bcmolt_epon_oam_ctc_event_status_entry *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_ctc_event_entry_unpack(&this->event_entry, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_ctc_event_status_unpack(&this->event_status, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_event_status_entry_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 12);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_event_threshold_entry_pack(bcmolt_epon_oam_ctc_event_threshold_entry *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_ctc_event_entry_pack(&this->event_entry, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->set_threshold))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->clear_threshold))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_event_threshold_entry_unpack(bcmolt_epon_oam_ctc_event_threshold_entry *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_ctc_event_entry_unpack(&this->event_entry, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->set_threshold))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->clear_threshold))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_event_threshold_entry_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 16);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_event_base_pack(bcmolt_epon_oam_ctc_event_base *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_ctc_event_sub_type_pack(this->sub_type, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->sub_type)
    {
        case BCMOLT_EPON_OAM_CTC_EVENT_SUB_TYPE_STATUS_REQUEST:
            {
                uint16_t i0;
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.status_request.entry_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.status_request.entry_count > 0) && (this->u.status_request.entries == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"entries\" of struct \"bcmolt_epon_oam_ctc_event_base_status_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i0 = 0; i0 < this->u.status_request.entry_count; i0++)
                {
                    if (!bcmolt_epon_oam_ctc_event_entry_pack(&this->u.status_request.entries[i0], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_EVENT_SUB_TYPE_STATUS_SET:
            {
                uint16_t i1;
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.status_set.entry_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.status_set.entry_count > 0) && (this->u.status_set.entries == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"entries\" of struct \"bcmolt_epon_oam_ctc_event_base_status_set\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i1 = 0; i1 < this->u.status_set.entry_count; i1++)
                {
                    if (!bcmolt_epon_oam_ctc_event_status_entry_pack(&this->u.status_set.entries[i1], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_EVENT_SUB_TYPE_STATUS_RESPONSE:
            {
                uint16_t i2;
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.status_response.entry_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.status_response.entry_count > 0) && (this->u.status_response.entries == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"entries\" of struct \"bcmolt_epon_oam_ctc_event_base_status_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i2 = 0; i2 < this->u.status_response.entry_count; i2++)
                {
                    if (!bcmolt_epon_oam_ctc_event_status_entry_pack(&this->u.status_response.entries[i2], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_EVENT_SUB_TYPE_THRESHOLD_REQUEST:
            {
                uint16_t i3;
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.threshold_request.entry_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.threshold_request.entry_count > 0) && (this->u.threshold_request.entries == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"entries\" of struct \"bcmolt_epon_oam_ctc_event_base_threshold_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i3 = 0; i3 < this->u.threshold_request.entry_count; i3++)
                {
                    if (!bcmolt_epon_oam_ctc_event_entry_pack(&this->u.threshold_request.entries[i3], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_EVENT_SUB_TYPE_THRESHOLD_SET:
            {
                uint16_t i4;
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.threshold_set.entry_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.threshold_set.entry_count > 0) && (this->u.threshold_set.entries == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"entries\" of struct \"bcmolt_epon_oam_ctc_event_base_threshold_set\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i4 = 0; i4 < this->u.threshold_set.entry_count; i4++)
                {
                    if (!bcmolt_epon_oam_ctc_event_threshold_entry_pack(&this->u.threshold_set.entries[i4], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_EVENT_SUB_TYPE_THRESHOLD_RESPONSE:
            {
                uint16_t i5;
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.threshold_response.entry_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.threshold_response.entry_count > 0) && (this->u.threshold_response.entries == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"entries\" of struct \"bcmolt_epon_oam_ctc_event_base_threshold_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i5 = 0; i5 < this->u.threshold_response.entry_count; i5++)
                {
                    if (!bcmolt_epon_oam_ctc_event_threshold_entry_pack(&this->u.threshold_response.entries[i5], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_event_base_get_packed_length(bcmolt_epon_oam_ctc_event_base *this)
{
    uint32_t count = 1;
    switch (this->sub_type)
    {
        case BCMOLT_EPON_OAM_CTC_EVENT_SUB_TYPE_STATUS_REQUEST:
            {
                count += 2 + (8 * this->u.status_request.entry_count);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_EVENT_SUB_TYPE_STATUS_SET:
            {
                count += 2 + (12 * this->u.status_set.entry_count);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_EVENT_SUB_TYPE_STATUS_RESPONSE:
            {
                count += 2 + (12 * this->u.status_response.entry_count);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_EVENT_SUB_TYPE_THRESHOLD_REQUEST:
            {
                count += 2 + (8 * this->u.threshold_request.entry_count);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_EVENT_SUB_TYPE_THRESHOLD_SET:
            {
                count += 2 + (16 * this->u.threshold_set.entry_count);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_EVENT_SUB_TYPE_THRESHOLD_RESPONSE:
            {
                count += 2 + (16 * this->u.threshold_response.entry_count);
            }
            break;
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_event_base_unpack(bcmolt_epon_oam_ctc_event_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_ctc_event_sub_type_unpack(&this->sub_type, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->sub_type)
    {
        case BCMOLT_EPON_OAM_CTC_EVENT_SUB_TYPE_STATUS_REQUEST:
            {
                uint16_t i0;
                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.status_request.entry_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.status_request.entry_count > 0) && (this->u.status_request.entries == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"entries\" of struct \"bcmolt_epon_oam_ctc_event_base_status_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.status_request.entries = (bcmolt_epon_oam_ctc_event_entry *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.status_request.entry_count * sizeof(bcmolt_epon_oam_ctc_event_entry));
                    }
                }

                for (i0 = 0; i0 < this->u.status_request.entry_count; i0++)
                {
                    if (!bcmolt_epon_oam_ctc_event_entry_unpack(&this->u.status_request.entries[i0], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_EVENT_SUB_TYPE_STATUS_SET:
            {
                uint16_t i1;
                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.status_set.entry_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.status_set.entry_count > 0) && (this->u.status_set.entries == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"entries\" of struct \"bcmolt_epon_oam_ctc_event_base_status_set\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.status_set.entries = (bcmolt_epon_oam_ctc_event_status_entry *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.status_set.entry_count * sizeof(bcmolt_epon_oam_ctc_event_status_entry));
                    }
                }

                for (i1 = 0; i1 < this->u.status_set.entry_count; i1++)
                {
                    if (!bcmolt_epon_oam_ctc_event_status_entry_unpack(&this->u.status_set.entries[i1], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_EVENT_SUB_TYPE_STATUS_RESPONSE:
            {
                uint16_t i2;
                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.status_response.entry_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.status_response.entry_count > 0) && (this->u.status_response.entries == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"entries\" of struct \"bcmolt_epon_oam_ctc_event_base_status_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.status_response.entries = (bcmolt_epon_oam_ctc_event_status_entry *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.status_response.entry_count * sizeof(bcmolt_epon_oam_ctc_event_status_entry));
                    }
                }

                for (i2 = 0; i2 < this->u.status_response.entry_count; i2++)
                {
                    if (!bcmolt_epon_oam_ctc_event_status_entry_unpack(&this->u.status_response.entries[i2], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_EVENT_SUB_TYPE_THRESHOLD_REQUEST:
            {
                uint16_t i3;
                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.threshold_request.entry_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.threshold_request.entry_count > 0) && (this->u.threshold_request.entries == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"entries\" of struct \"bcmolt_epon_oam_ctc_event_base_threshold_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.threshold_request.entries = (bcmolt_epon_oam_ctc_event_entry *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.threshold_request.entry_count * sizeof(bcmolt_epon_oam_ctc_event_entry));
                    }
                }

                for (i3 = 0; i3 < this->u.threshold_request.entry_count; i3++)
                {
                    if (!bcmolt_epon_oam_ctc_event_entry_unpack(&this->u.threshold_request.entries[i3], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_EVENT_SUB_TYPE_THRESHOLD_SET:
            {
                uint16_t i4;
                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.threshold_set.entry_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.threshold_set.entry_count > 0) && (this->u.threshold_set.entries == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"entries\" of struct \"bcmolt_epon_oam_ctc_event_base_threshold_set\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.threshold_set.entries = (bcmolt_epon_oam_ctc_event_threshold_entry *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.threshold_set.entry_count * sizeof(bcmolt_epon_oam_ctc_event_threshold_entry));
                    }
                }

                for (i4 = 0; i4 < this->u.threshold_set.entry_count; i4++)
                {
                    if (!bcmolt_epon_oam_ctc_event_threshold_entry_unpack(&this->u.threshold_set.entries[i4], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_EVENT_SUB_TYPE_THRESHOLD_RESPONSE:
            {
                uint16_t i5;
                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.threshold_response.entry_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.threshold_response.entry_count > 0) && (this->u.threshold_response.entries == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"entries\" of struct \"bcmolt_epon_oam_ctc_event_base_threshold_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.threshold_response.entries = (bcmolt_epon_oam_ctc_event_threshold_entry *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.threshold_response.entry_count * sizeof(bcmolt_epon_oam_ctc_event_threshold_entry));
                    }
                }

                for (i5 = 0; i5 < this->u.threshold_response.entry_count; i5++)
                {
                    if (!bcmolt_epon_oam_ctc_event_threshold_entry_unpack(&this->u.threshold_response.entries[i5], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_event_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_ctc_event_sub_type sub_type;
    if (!bcmolt_epon_oam_ctc_event_sub_type_unpack(&sub_type, packed))
    {
        return BCMOS_FALSE;
    }

    switch (sub_type)
    {
        case BCMOLT_EPON_OAM_CTC_EVENT_SUB_TYPE_STATUS_REQUEST:
            {
                uint16_t entry_count;
                if (!bcmolt_epon_oam_buf_read_u16(packed, &entry_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_ctc_event_entry) * entry_count);
                if (!bcmolt_epon_oam_buf_skip(packed, entry_count * 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_EVENT_SUB_TYPE_STATUS_SET:
            {
                uint16_t entry_count;
                if (!bcmolt_epon_oam_buf_read_u16(packed, &entry_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_ctc_event_status_entry) * entry_count);
                if (!bcmolt_epon_oam_buf_skip(packed, entry_count * 12))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_EVENT_SUB_TYPE_STATUS_RESPONSE:
            {
                uint16_t entry_count;
                if (!bcmolt_epon_oam_buf_read_u16(packed, &entry_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_ctc_event_status_entry) * entry_count);
                if (!bcmolt_epon_oam_buf_skip(packed, entry_count * 12))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_EVENT_SUB_TYPE_THRESHOLD_REQUEST:
            {
                uint16_t entry_count;
                if (!bcmolt_epon_oam_buf_read_u16(packed, &entry_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_ctc_event_entry) * entry_count);
                if (!bcmolt_epon_oam_buf_skip(packed, entry_count * 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_EVENT_SUB_TYPE_THRESHOLD_SET:
            {
                uint16_t entry_count;
                if (!bcmolt_epon_oam_buf_read_u16(packed, &entry_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_ctc_event_threshold_entry) * entry_count);
                if (!bcmolt_epon_oam_buf_skip(packed, entry_count * 16))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_EVENT_SUB_TYPE_THRESHOLD_RESPONSE:
            {
                uint16_t entry_count;
                if (!bcmolt_epon_oam_buf_read_u16(packed, &entry_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_ctc_event_threshold_entry) * entry_count);
                if (!bcmolt_epon_oam_buf_skip(packed, entry_count * 16))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_ext_action_value_base_pack(bcmolt_epon_oam_ctc_ext_action_value_base *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_ctc_leaf_ext_action_pack(this->leaf, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->leaf)
    {
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ACTION_RESET_ONU:
            {
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ACTION_FAST_LEAVE_ADMIN_CONTROL:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.fast_leave_admin_control.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.fast_leave_admin_control.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_activation_pack(this->u.fast_leave_admin_control.activate_fast_leave, buf))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ACTION_MULTI_LLID_ADMIN_CONTROL:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.multi_llid_admin_control.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.multi_llid_admin_control.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.multi_llid_admin_control.num_llids))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ACTION_RESET_CARD:
            {
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ACTION_SLEEP_CONTROL:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.sleep_control.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.sleep_control.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.sleep_control.sleep_duration))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.sleep_control.wake_duration))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_sleep_flag_pack(this->u.sleep_control.sleep_flag, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_sleep_mode_pack(this->u.sleep_control.sleep_mode, buf))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.def.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.def.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_ext_action_value_base_get_packed_length(bcmolt_epon_oam_ctc_ext_action_value_base *this)
{
    uint32_t count = 2;
    switch (this->leaf)
    {
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ACTION_RESET_ONU:
            {
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ACTION_FAST_LEAVE_ADMIN_CONTROL:
            {
                count += 5;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ACTION_MULTI_LLID_ADMIN_CONTROL:
            {
                count += 5;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ACTION_RESET_CARD:
            {
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ACTION_SLEEP_CONTROL:
            {
                count += 11;
            }
            break;
        default:
            {
                count += 1;
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_ext_action_value_base_unpack(bcmolt_epon_oam_ctc_ext_action_value_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_ctc_leaf_ext_action_unpack(&this->leaf, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->leaf)
    {
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ACTION_RESET_ONU:
            {
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ACTION_FAST_LEAVE_ADMIN_CONTROL:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.fast_leave_admin_control.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.fast_leave_admin_control.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.fast_leave_admin_control.width == 0) ? 0x0080 : this->u.fast_leave_admin_control.width, buf->curr);
                if (!bcmolt_epon_oam_ctc_activation_unpack(&this->u.fast_leave_admin_control.activate_fast_leave, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.fast_leave_admin_control.width == 0) ? 0x0080 : this->u.fast_leave_admin_control.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ACTION_MULTI_LLID_ADMIN_CONTROL:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.multi_llid_admin_control.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.multi_llid_admin_control.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.multi_llid_admin_control.width == 0) ? 0x0080 : this->u.multi_llid_admin_control.width, buf->curr);
                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.multi_llid_admin_control.num_llids))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.multi_llid_admin_control.width == 0) ? 0x0080 : this->u.multi_llid_admin_control.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ACTION_RESET_CARD:
            {
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ACTION_SLEEP_CONTROL:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.sleep_control.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.sleep_control.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.sleep_control.width == 0) ? 0x0080 : this->u.sleep_control.width, buf->curr);
                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.sleep_control.sleep_duration))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.sleep_control.wake_duration))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_sleep_flag_unpack(&this->u.sleep_control.sleep_flag, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_sleep_mode_unpack(&this->u.sleep_control.sleep_mode, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.sleep_control.width == 0) ? 0x0080 : this->u.sleep_control.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.def.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.def.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.def.width == 0) ? 0x0080 : this->u.def.width, buf->curr);
                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.def.width == 0) ? 0x0080 : this->u.def.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_ext_action_value_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_ctc_leaf_ext_action leaf;
    if (!bcmolt_epon_oam_ctc_leaf_ext_action_unpack(&leaf, packed))
    {
        return BCMOS_FALSE;
    }

    switch (leaf)
    {
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ACTION_RESET_ONU:
            {
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ACTION_FAST_LEAVE_ADMIN_CONTROL:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ACTION_MULTI_LLID_ADMIN_CONTROL:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ACTION_RESET_CARD:
            {
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ACTION_SLEEP_CONTROL:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_onu_service_sla_table_pack(bcmolt_epon_oam_ctc_onu_service_sla_table *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u8(buf, this->queue_number))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->fixed_packet_size))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->fixed_bandwidth))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->guaranteed_bandwidth))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->best_effort_bandwidth))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->wrr_weight))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_onu_service_sla_table_unpack(bcmolt_epon_oam_ctc_onu_service_sla_table *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->queue_number))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->fixed_packet_size))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->fixed_bandwidth))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->guaranteed_bandwidth))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->best_effort_bandwidth))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->wrr_weight))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_onu_service_sla_table_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 10);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_onu_service_sla_base_pack(bcmolt_epon_oam_ctc_onu_service_sla_base *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_ctc_service_sla_operation_pack(this->operation_of_service_dba, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->operation_of_service_dba)
    {
        case BCMOLT_EPON_OAM_CTC_SERVICE_SLA_OPERATION_DEACTIVATE:
            {
            }
            break;
        case BCMOLT_EPON_OAM_CTC_SERVICE_SLA_OPERATION_ACTIVATE:
            {
                uint8_t i0;
                if (!bcmolt_epon_oam_ctc_onu_dba_scheduling_scheme_pack(this->u.activate.scheme, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.activate.priority))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.activate.cycle_length))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.activate.services_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.activate.services_count > 0) && (this->u.activate.services == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"services\" of struct \"bcmolt_epon_oam_ctc_onu_service_sla_base_activate\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i0 = 0; i0 < this->u.activate.services_count; i0++)
                {
                    if (!bcmolt_epon_oam_ctc_onu_service_sla_table_pack(&this->u.activate.services[i0], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        default:
            {
                if ((this->u.def.services_count > 0) && (this->u.def.services == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"services\" of struct \"bcmolt_epon_oam_ctc_onu_service_sla_base_def\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.def.services, this->u.def.services_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_onu_service_sla_base_get_packed_length(bcmolt_epon_oam_ctc_onu_service_sla_base *this)
{
    uint32_t count = 1;
    switch (this->operation_of_service_dba)
    {
        case BCMOLT_EPON_OAM_CTC_SERVICE_SLA_OPERATION_DEACTIVATE:
            {
            }
            break;
        case BCMOLT_EPON_OAM_CTC_SERVICE_SLA_OPERATION_ACTIVATE:
            {
                count += 7 + (10 * this->u.activate.services_count);
            }
            break;
        default:
            {
                count += this->u.def.services_count;
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_onu_service_sla_base_unpack(bcmolt_epon_oam_ctc_onu_service_sla_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_ctc_service_sla_operation_unpack(&this->operation_of_service_dba, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->operation_of_service_dba)
    {
        case BCMOLT_EPON_OAM_CTC_SERVICE_SLA_OPERATION_DEACTIVATE:
            {
            }
            break;
        case BCMOLT_EPON_OAM_CTC_SERVICE_SLA_OPERATION_ACTIVATE:
            {
                uint8_t i0;
                if (!bcmolt_epon_oam_ctc_onu_dba_scheduling_scheme_unpack(&this->u.activate.scheme, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.activate.priority))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(buf, &this->u.activate.cycle_length))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.activate.services_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.activate.services_count > 0) && (this->u.activate.services == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"services\" of struct \"bcmolt_epon_oam_ctc_onu_service_sla_base_activate\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.activate.services = (bcmolt_epon_oam_ctc_onu_service_sla_table *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.activate.services_count * sizeof(bcmolt_epon_oam_ctc_onu_service_sla_table));
                    }
                }

                for (i0 = 0; i0 < this->u.activate.services_count; i0++)
                {
                    if (!bcmolt_epon_oam_ctc_onu_service_sla_table_unpack(&this->u.activate.services[i0], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        default:
            {
                this->u.def.services_count = bcmolt_epon_oam_ctc_onu_service_sla_base_def_count_services(buf);
                if ((this->u.def.services_count > 0) && (this->u.def.services == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"services\" of struct \"bcmolt_epon_oam_ctc_onu_service_sla_base_def\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.def.services = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.def.services_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.def.services, this->u.def.services_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_onu_service_sla_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_ctc_service_sla_operation operation_of_service_dba;
    if (!bcmolt_epon_oam_ctc_service_sla_operation_unpack(&operation_of_service_dba, packed))
    {
        return BCMOS_FALSE;
    }

    switch (operation_of_service_dba)
    {
        case BCMOLT_EPON_OAM_CTC_SERVICE_SLA_OPERATION_DEACTIVATE:
            {
            }
            break;
        case BCMOLT_EPON_OAM_CTC_SERVICE_SLA_OPERATION_ACTIVATE:
            {
                uint8_t services_count;
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(packed, &services_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_ctc_onu_service_sla_table) * services_count);
                if (!bcmolt_epon_oam_buf_skip(packed, services_count * 10))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
                uint32_t services_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(packed, 1))
                    {
                        break;
                    }

                    services_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(services_elem_count * sizeof(uint8_t));
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_onu_service_sla_base_def_count_services(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_onu_interface_pack(bcmolt_epon_oam_ctc_onu_interface *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_ctc_onu_interface_type_pack(this->type, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->num_ports))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_onu_interface_unpack(bcmolt_epon_oam_ctc_onu_interface *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_ctc_onu_interface_type_unpack(&this->type, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->num_ports))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_onu_interface_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 6);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_mxu_global_params_base_pack(bcmolt_epon_oam_ctc_mxu_global_params_base *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_ctc_mxu_global_params_width_pack(this->width, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->width)
    {
        case BCMOLT_EPON_OAM_CTC_MXU_GLOBAL_PARAMS_WIDTH_IPV4:
            {
                if (!bcmolt_epon_oam_buf_write_ipv4_address(buf, this->u.ipv4.onu_ipaddress))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_ipv4_address(buf, this->u.ipv4.onu_network_mask))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_ipv4_address(buf, this->u.ipv4.onu_default_gw))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.ipv4.data_cvlan))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.ipv4.data_svlan))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.ipv4.data_priority))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MXU_GLOBAL_PARAMS_WIDTH_IPV6:
            {
                if (!bcmolt_epon_oam_buf_write_ipv6_address(buf, this->u.ipv6.onu_ipaddress))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.ipv6.ipv6prefix_length))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_ipv6_address(buf, this->u.ipv6.onu_default_gw))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.ipv6.data_cvlan))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.ipv6.data_svlan))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.ipv6.data_priority))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_mxu_global_params_base_get_packed_length(bcmolt_epon_oam_ctc_mxu_global_params_base *this)
{
    uint32_t count = 1;
    switch (this->width)
    {
        case BCMOLT_EPON_OAM_CTC_MXU_GLOBAL_PARAMS_WIDTH_IPV4:
            {
                count += 17;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MXU_GLOBAL_PARAMS_WIDTH_IPV6:
            {
                count += 41;
            }
            break;
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_mxu_global_params_base_unpack(bcmolt_epon_oam_ctc_mxu_global_params_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_ctc_mxu_global_params_width_unpack(&this->width, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->width)
    {
        case BCMOLT_EPON_OAM_CTC_MXU_GLOBAL_PARAMS_WIDTH_IPV4:
            {
                if (!bcmolt_epon_oam_buf_read_ipv4_address(buf, &this->u.ipv4.onu_ipaddress))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_ipv4_address(buf, &this->u.ipv4.onu_network_mask))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_ipv4_address(buf, &this->u.ipv4.onu_default_gw))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.ipv4.data_cvlan))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.ipv4.data_svlan))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.ipv4.data_priority))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MXU_GLOBAL_PARAMS_WIDTH_IPV6:
            {
                if (!bcmolt_epon_oam_buf_read_ipv6_address(buf, &this->u.ipv6.onu_ipaddress))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(buf, &this->u.ipv6.ipv6prefix_length))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_ipv6_address(buf, &this->u.ipv6.onu_default_gw))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.ipv6.data_cvlan))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.ipv6.data_svlan))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.ipv6.data_priority))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_mxu_global_params_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_ctc_mxu_global_params_width width;
    if (!bcmolt_epon_oam_ctc_mxu_global_params_width_unpack(&width, packed))
    {
        return BCMOS_FALSE;
    }

    switch (width)
    {
        case BCMOLT_EPON_OAM_CTC_MXU_GLOBAL_PARAMS_WIDTH_IPV4:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MXU_GLOBAL_PARAMS_WIDTH_IPV6:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_mxu_snmp_params_base_pack(bcmolt_epon_oam_ctc_mxu_snmp_params_base *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_ctc_mxu_snmp_params_width_pack(this->width, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->width)
    {
        case BCMOLT_EPON_OAM_CTC_MXU_SNMP_PARAMS_WIDTH_IPV4:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.ipv4.snmp_version))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_ipv4_address(buf, this->u.ipv4.trap_host_ip))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.ipv4.trap_port))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.ipv4.snmp_port))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.ipv4.security_name, 32))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.ipv4.community_for_read, 32))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.ipv4.community_for_write, 32))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MXU_SNMP_PARAMS_WIDTH_IPV6:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.ipv6.snmp_version))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_ipv6_address(buf, this->u.ipv6.trap_host_ip))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.ipv6.trap_port))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.ipv6.snmp_port))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.ipv6.security_name, 32))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.ipv6.community_for_read, 32))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.ipv6.community_for_write, 32))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_mxu_snmp_params_base_get_packed_length(bcmolt_epon_oam_ctc_mxu_snmp_params_base *this)
{
    uint32_t count = 1;
    switch (this->width)
    {
        case BCMOLT_EPON_OAM_CTC_MXU_SNMP_PARAMS_WIDTH_IPV4:
            {
                count += 105;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MXU_SNMP_PARAMS_WIDTH_IPV6:
            {
                count += 117;
            }
            break;
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_mxu_snmp_params_base_unpack(bcmolt_epon_oam_ctc_mxu_snmp_params_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_ctc_mxu_snmp_params_width_unpack(&this->width, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->width)
    {
        case BCMOLT_EPON_OAM_CTC_MXU_SNMP_PARAMS_WIDTH_IPV4:
            {
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.ipv4.snmp_version))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_ipv4_address(buf, &this->u.ipv4.trap_host_ip))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.ipv4.trap_port))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.ipv4.snmp_port))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.ipv4.security_name, 32))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.ipv4.community_for_read, 32))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.ipv4.community_for_write, 32))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MXU_SNMP_PARAMS_WIDTH_IPV6:
            {
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.ipv6.snmp_version))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_ipv6_address(buf, &this->u.ipv6.trap_host_ip))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.ipv6.trap_port))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.ipv6.snmp_port))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.ipv6.security_name, 32))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.ipv6.community_for_read, 32))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.ipv6.community_for_write, 32))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_mxu_snmp_params_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_ctc_mxu_snmp_params_width width;
    if (!bcmolt_epon_oam_ctc_mxu_snmp_params_width_unpack(&width, packed))
    {
        return BCMOS_FALSE;
    }

    switch (width)
    {
        case BCMOLT_EPON_OAM_CTC_MXU_SNMP_PARAMS_WIDTH_IPV4:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 32))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 32))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 32))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MXU_SNMP_PARAMS_WIDTH_IPV6:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 32))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 32))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 32))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_vlan_element_pack(bcmolt_epon_oam_ctc_vlan_element *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u16(buf, this->ether_type))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_vlan_tag(buf, this->vlan_tag))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_vlan_element_unpack(bcmolt_epon_oam_ctc_vlan_element *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->ether_type))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_vlan_tag(buf, &this->vlan_tag))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_vlan_element_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 4);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_vlan_translation_pack(bcmolt_epon_oam_ctc_vlan_translation *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_ctc_vlan_element_pack(&this->old_vlan, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_ctc_vlan_element_pack(&this->new_vlan, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_vlan_translation_unpack(bcmolt_epon_oam_ctc_vlan_translation *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_ctc_vlan_element_unpack(&this->old_vlan, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_ctc_vlan_element_unpack(&this->new_vlan, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_vlan_translation_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 8);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_vlan_aggregate_table_pack(bcmolt_epon_oam_ctc_vlan_aggregate_table *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t i0;
    if (!bcmolt_epon_oam_buf_write_u16(buf, this->vlans_count))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_ctc_vlan_element_pack(&this->svlan, buf))
    {
        return BCMOS_FALSE;
    }

    if ((this->vlans_count > 0) && (this->vlans == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vlans\" of struct \"bcmolt_epon_oam_ctc_vlan_aggregate_table\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->vlans_count; i0++)
    {
        if (!bcmolt_epon_oam_ctc_vlan_element_pack(&this->vlans[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_vlan_aggregate_table_get_packed_length(bcmolt_epon_oam_ctc_vlan_aggregate_table *this)
{
    return 6 + (4 * this->vlans_count);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_vlan_aggregate_table_unpack(bcmolt_epon_oam_ctc_vlan_aggregate_table *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint16_t i0;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->vlans_count))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_ctc_vlan_element_unpack(&this->svlan, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    if ((this->vlans_count > 0) && (this->vlans == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vlans\" of struct \"bcmolt_epon_oam_ctc_vlan_aggregate_table\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->vlans = (bcmolt_epon_oam_ctc_vlan_element *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->vlans_count * sizeof(bcmolt_epon_oam_ctc_vlan_element));
        }
    }

    for (i0 = 0; i0 < this->vlans_count; i0++)
    {
        if (!bcmolt_epon_oam_ctc_vlan_element_unpack(&this->vlans[i0], buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_vlan_aggregate_table_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    uint16_t vlans_count;
    if (!bcmolt_epon_oam_buf_read_u16(packed, &vlans_count))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_ctc_vlan_element) * vlans_count);
    if (!bcmolt_epon_oam_buf_skip(packed, vlans_count * 4))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_vlan_prov_base_pack(bcmolt_epon_oam_ctc_vlan_prov_base *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_ctc_vlan_mode_pack(this->mode, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->mode)
    {
        case BCMOLT_EPON_OAM_CTC_VLAN_MODE_TRANSPARENT:
            {
            }
            break;
        case BCMOLT_EPON_OAM_CTC_VLAN_MODE_TAG:
            {
                if (!bcmolt_epon_oam_ctc_vlan_element_pack(&this->u.tag.vlan, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_VLAN_MODE_TRANSLATION:
            {
                uint32_t i0;
                if (!bcmolt_epon_oam_ctc_vlan_element_pack(&this->u.translation.default_vlan, buf))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.translation.translations_count > 0) && (this->u.translation.translations == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"translations\" of struct \"bcmolt_epon_oam_ctc_vlan_prov_base_translation\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i0 = 0; i0 < this->u.translation.translations_count; i0++)
                {
                    if (!bcmolt_epon_oam_ctc_vlan_translation_pack(&this->u.translation.translations[i0], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_VLAN_MODE_TRUNK:
            {
                uint32_t i1;
                if (!bcmolt_epon_oam_ctc_vlan_element_pack(&this->u.trunk.default_vlan, buf))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.trunk.permitted_vlans_count > 0) && (this->u.trunk.permitted_vlans == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"permitted_vlans\" of struct \"bcmolt_epon_oam_ctc_vlan_prov_base_trunk\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i1 = 0; i1 < this->u.trunk.permitted_vlans_count; i1++)
                {
                    if (!bcmolt_epon_oam_ctc_vlan_element_pack(&this->u.trunk.permitted_vlans[i1], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_VLAN_MODE_AGGREGATE:
            {
                uint16_t i2;
                if (!bcmolt_epon_oam_ctc_vlan_element_pack(&this->u.aggregate.default_vlan, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.aggregate.tables_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.aggregate.tables_count > 0) && (this->u.aggregate.tables == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"tables\" of struct \"bcmolt_epon_oam_ctc_vlan_prov_base_aggregate\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i2 = 0; i2 < this->u.aggregate.tables_count; i2++)
                {
                    if (!bcmolt_epon_oam_ctc_vlan_aggregate_table_pack(&this->u.aggregate.tables[i2], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_VLAN_MODE_TRUNK_MDU:
            {
                uint32_t i3;
                if ((this->u.trunk_mdu.permitted_vlans_count > 0) && (this->u.trunk_mdu.permitted_vlans == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"permitted_vlans\" of struct \"bcmolt_epon_oam_ctc_vlan_prov_base_trunk_mdu\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i3 = 0; i3 < this->u.trunk_mdu.permitted_vlans_count; i3++)
                {
                    if (!bcmolt_epon_oam_ctc_vlan_element_pack(&this->u.trunk_mdu.permitted_vlans[i3], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_VLAN_MODE_HYBRID:
            {
                uint32_t i4;
                if (!bcmolt_epon_oam_ctc_vlan_element_pack(&this->u.hybrid.default_vlan, buf))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.hybrid.permitted_vlans_count > 0) && (this->u.hybrid.permitted_vlans == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"permitted_vlans\" of struct \"bcmolt_epon_oam_ctc_vlan_prov_base_hybrid\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i4 = 0; i4 < this->u.hybrid.permitted_vlans_count; i4++)
                {
                    if (!bcmolt_epon_oam_ctc_vlan_element_pack(&this->u.hybrid.permitted_vlans[i4], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_VLAN_MODE_SPECIAL_TRANSPARENT:
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_vlan_prov_base_get_packed_length(bcmolt_epon_oam_ctc_vlan_prov_base *this)
{
    uint32_t count = 1;
    switch (this->mode)
    {
        case BCMOLT_EPON_OAM_CTC_VLAN_MODE_TRANSPARENT:
            {
            }
            break;
        case BCMOLT_EPON_OAM_CTC_VLAN_MODE_TAG:
            {
                count += 4;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_VLAN_MODE_TRANSLATION:
            {
                count += 4 + (8 * this->u.translation.translations_count);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_VLAN_MODE_TRUNK:
            {
                count += 4 + (4 * this->u.trunk.permitted_vlans_count);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_VLAN_MODE_AGGREGATE:
            {
                uint32_t i0;
                count += 6;
                if ((this->u.aggregate.tables_count > 0) && (this->u.aggregate.tables == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"tables_count\" of struct \"bcmolt_epon_oam_ctc_vlan_prov_base\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return 0;
                }

                for (i0 = 0; i0 < this->u.aggregate.tables_count; i0++)
                {
                    count += bcmolt_epon_oam_ctc_vlan_aggregate_table_get_packed_length(&this->u.aggregate.tables[i0]);
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_VLAN_MODE_TRUNK_MDU:
            {
                count += (4 * this->u.trunk_mdu.permitted_vlans_count);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_VLAN_MODE_HYBRID:
            {
                count += 4 + (4 * this->u.hybrid.permitted_vlans_count);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_VLAN_MODE_SPECIAL_TRANSPARENT:
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_vlan_prov_base_unpack(bcmolt_epon_oam_ctc_vlan_prov_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_ctc_vlan_mode_unpack(&this->mode, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->mode)
    {
        case BCMOLT_EPON_OAM_CTC_VLAN_MODE_TRANSPARENT:
            {
            }
            break;
        case BCMOLT_EPON_OAM_CTC_VLAN_MODE_TAG:
            {
                if (!bcmolt_epon_oam_ctc_vlan_element_unpack(&this->u.tag.vlan, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_VLAN_MODE_TRANSLATION:
            {
                uint32_t i0;
                if (!bcmolt_epon_oam_ctc_vlan_element_unpack(&this->u.translation.default_vlan, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                this->u.translation.translations_count = bcmolt_epon_oam_ctc_vlan_prov_base_translation_count_translations(buf);
                if ((this->u.translation.translations_count > 0) && (this->u.translation.translations == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"translations\" of struct \"bcmolt_epon_oam_ctc_vlan_prov_base_translation\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.translation.translations = (bcmolt_epon_oam_ctc_vlan_translation *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.translation.translations_count * sizeof(bcmolt_epon_oam_ctc_vlan_translation));
                    }
                }

                for (i0 = 0; i0 < this->u.translation.translations_count; i0++)
                {
                    if (!bcmolt_epon_oam_ctc_vlan_translation_unpack(&this->u.translation.translations[i0], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_VLAN_MODE_TRUNK:
            {
                uint32_t i1;
                if (!bcmolt_epon_oam_ctc_vlan_element_unpack(&this->u.trunk.default_vlan, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                this->u.trunk.permitted_vlans_count = bcmolt_epon_oam_ctc_vlan_prov_base_trunk_count_permitted_vlans(buf);
                if ((this->u.trunk.permitted_vlans_count > 0) && (this->u.trunk.permitted_vlans == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"permitted_vlans\" of struct \"bcmolt_epon_oam_ctc_vlan_prov_base_trunk\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.trunk.permitted_vlans = (bcmolt_epon_oam_ctc_vlan_element *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.trunk.permitted_vlans_count * sizeof(bcmolt_epon_oam_ctc_vlan_element));
                    }
                }

                for (i1 = 0; i1 < this->u.trunk.permitted_vlans_count; i1++)
                {
                    if (!bcmolt_epon_oam_ctc_vlan_element_unpack(&this->u.trunk.permitted_vlans[i1], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_VLAN_MODE_AGGREGATE:
            {
                uint16_t i2;
                if (!bcmolt_epon_oam_ctc_vlan_element_unpack(&this->u.aggregate.default_vlan, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.aggregate.tables_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.aggregate.tables_count > 0) && (this->u.aggregate.tables == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"tables\" of struct \"bcmolt_epon_oam_ctc_vlan_prov_base_aggregate\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.aggregate.tables = (bcmolt_epon_oam_ctc_vlan_aggregate_table *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.aggregate.tables_count * sizeof(bcmolt_epon_oam_ctc_vlan_aggregate_table));
                    }
                }

                for (i2 = 0; i2 < this->u.aggregate.tables_count; i2++)
                {
                    if (!bcmolt_epon_oam_ctc_vlan_aggregate_table_unpack(&this->u.aggregate.tables[i2], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_VLAN_MODE_TRUNK_MDU:
            {
                uint32_t i3;
                this->u.trunk_mdu.permitted_vlans_count = bcmolt_epon_oam_ctc_vlan_prov_base_trunk_mdu_count_permitted_vlans(buf);
                if ((this->u.trunk_mdu.permitted_vlans_count > 0) && (this->u.trunk_mdu.permitted_vlans == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"permitted_vlans\" of struct \"bcmolt_epon_oam_ctc_vlan_prov_base_trunk_mdu\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.trunk_mdu.permitted_vlans = (bcmolt_epon_oam_ctc_vlan_element *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.trunk_mdu.permitted_vlans_count * sizeof(bcmolt_epon_oam_ctc_vlan_element));
                    }
                }

                for (i3 = 0; i3 < this->u.trunk_mdu.permitted_vlans_count; i3++)
                {
                    if (!bcmolt_epon_oam_ctc_vlan_element_unpack(&this->u.trunk_mdu.permitted_vlans[i3], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_VLAN_MODE_HYBRID:
            {
                uint32_t i4;
                if (!bcmolt_epon_oam_ctc_vlan_element_unpack(&this->u.hybrid.default_vlan, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                this->u.hybrid.permitted_vlans_count = bcmolt_epon_oam_ctc_vlan_prov_base_hybrid_count_permitted_vlans(buf);
                if ((this->u.hybrid.permitted_vlans_count > 0) && (this->u.hybrid.permitted_vlans == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"permitted_vlans\" of struct \"bcmolt_epon_oam_ctc_vlan_prov_base_hybrid\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.hybrid.permitted_vlans = (bcmolt_epon_oam_ctc_vlan_element *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.hybrid.permitted_vlans_count * sizeof(bcmolt_epon_oam_ctc_vlan_element));
                    }
                }

                for (i4 = 0; i4 < this->u.hybrid.permitted_vlans_count; i4++)
                {
                    if (!bcmolt_epon_oam_ctc_vlan_element_unpack(&this->u.hybrid.permitted_vlans[i4], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_VLAN_MODE_SPECIAL_TRANSPARENT:
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_vlan_prov_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_ctc_vlan_mode mode;
    if (!bcmolt_epon_oam_ctc_vlan_mode_unpack(&mode, packed))
    {
        return BCMOS_FALSE;
    }

    switch (mode)
    {
        case BCMOLT_EPON_OAM_CTC_VLAN_MODE_TRANSPARENT:
            {
            }
            break;
        case BCMOLT_EPON_OAM_CTC_VLAN_MODE_TAG:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_VLAN_MODE_TRANSLATION:
            {
                uint32_t translations_elem_count = 0;
                if (!bcmolt_epon_oam_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }

                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(packed, 8))
                    {
                        break;
                    }

                    translations_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(translations_elem_count * sizeof(bcmolt_epon_oam_ctc_vlan_translation));
            }
            break;
        case BCMOLT_EPON_OAM_CTC_VLAN_MODE_TRUNK:
            {
                uint32_t permitted_vlans_elem_count = 0;
                if (!bcmolt_epon_oam_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }

                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(packed, 4))
                    {
                        break;
                    }

                    permitted_vlans_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(permitted_vlans_elem_count * sizeof(bcmolt_epon_oam_ctc_vlan_element));
            }
            break;
        case BCMOLT_EPON_OAM_CTC_VLAN_MODE_AGGREGATE:
            {
                uint16_t tables_count;
                uint16_t i0;
                if (!bcmolt_epon_oam_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(packed, &tables_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_ctc_vlan_aggregate_table) * tables_count);
                for (i0 = 0; i0 < tables_count; i0++)
                {
                    if (!bcmolt_epon_oam_ctc_vlan_aggregate_table_scan(packed, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_VLAN_MODE_TRUNK_MDU:
            {
                uint32_t permitted_vlans_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(packed, 4))
                    {
                        break;
                    }

                    permitted_vlans_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(permitted_vlans_elem_count * sizeof(bcmolt_epon_oam_ctc_vlan_element));
            }
            break;
        case BCMOLT_EPON_OAM_CTC_VLAN_MODE_HYBRID:
            {
                uint32_t permitted_vlans_elem_count = 0;
                if (!bcmolt_epon_oam_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }

                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(packed, 4))
                    {
                        break;
                    }

                    permitted_vlans_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(permitted_vlans_elem_count * sizeof(bcmolt_epon_oam_ctc_vlan_element));
            }
            break;
        case BCMOLT_EPON_OAM_CTC_VLAN_MODE_SPECIAL_TRANSPARENT:
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_vlan_prov_base_translation_count_translations(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 8);
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_vlan_prov_base_trunk_count_permitted_vlans(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 4);
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_vlan_prov_base_trunk_mdu_count_permitted_vlans(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 4);
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_vlan_prov_base_hybrid_count_permitted_vlans(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 4);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_onu_classif_clause_base_pack(bcmolt_epon_oam_ctc_onu_classif_clause_base *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_ctc_onu_classif_field_pack(this->field, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->field)
    {
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_DA:
            {
                if (!bcmolt_epon_oam_buf_write_mac_address(buf, this->u.da.val))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_classif_operator_pack(this->u.da.op, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_SA:
            {
                if (!bcmolt_epon_oam_buf_write_mac_address(buf, this->u.sa.val))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_classif_operator_pack(this->u.sa.op, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_VLAN_PRI:
            {
                if (!bcmolt_epon_oam_buf_write(buf, this->u.vlan_pri.reserved, 5))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.vlan_pri.val))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_classif_operator_pack(this->u.vlan_pri.op, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_VLAN_ID:
            {
                if (!bcmolt_epon_oam_buf_write(buf, this->u.vlan_id.reserved, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.vlan_id.val))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_classif_operator_pack(this->u.vlan_id.op, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_ETH_TYPE:
            {
                if (!bcmolt_epon_oam_buf_write(buf, this->u.eth_type.reserved, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.eth_type.val))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_classif_operator_pack(this->u.eth_type.op, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_DEST_IP:
            {
                if (!bcmolt_epon_oam_buf_write(buf, this->u.dest_ip.reserved, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_ipv4_address(buf, this->u.dest_ip.val))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_classif_operator_pack(this->u.dest_ip.op, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_SOURCE_IP:
            {
                if (!bcmolt_epon_oam_buf_write(buf, this->u.source_ip.reserved, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_ipv4_address(buf, this->u.source_ip.val))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_classif_operator_pack(this->u.source_ip.op, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_IP_TYPE:
            {
                if (!bcmolt_epon_oam_buf_write(buf, this->u.ip_type.reserved, 5))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.ip_type.val))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_classif_operator_pack(this->u.ip_type.op, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_IP_TOS:
            {
                if (!bcmolt_epon_oam_buf_write(buf, this->u.ip_tos.reserved, 5))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.ip_tos.val))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_classif_operator_pack(this->u.ip_tos.op, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_IP_PREC:
            {
                if (!bcmolt_epon_oam_buf_write(buf, this->u.ip_prec.reserved, 5))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.ip_prec.val))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_classif_operator_pack(this->u.ip_prec.op, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_SOURCE_PORT:
            {
                if (!bcmolt_epon_oam_buf_write(buf, this->u.source_port.reserved, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.source_port.val))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_classif_operator_pack(this->u.source_port.op, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_DEST_PORT:
            {
                if (!bcmolt_epon_oam_buf_write(buf, this->u.dest_port.reserved, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.dest_port.val))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_classif_operator_pack(this->u.dest_port.op, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_IP_VER:
            {
                if (!bcmolt_epon_oam_buf_write(buf, this->u.ip_ver.reserved, 15))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.ip_ver.val))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_classif_operator_pack(this->u.ip_ver.op, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_IP_FLOW_LABEL:
            {
                if (!bcmolt_epon_oam_buf_write(buf, this->u.ip_flow_label.reserved, 12))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.ip_flow_label.val))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_classif_operator_pack(this->u.ip_flow_label.op, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_DST_IPV6:
            {
                if (!bcmolt_epon_oam_buf_write_ipv6_address(buf, this->u.dst_ipv6.val))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_classif_operator_pack(this->u.dst_ipv6.op, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_SRC_IPV6:
            {
                if (!bcmolt_epon_oam_buf_write_ipv6_address(buf, this->u.src_ipv6.val))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_classif_operator_pack(this->u.src_ipv6.op, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_DST_IPV6PRE:
            {
                if (!bcmolt_epon_oam_buf_write_ipv6_address(buf, this->u.dst_ipv6pre.val))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_classif_operator_pack(this->u.dst_ipv6pre.op, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_SRC_IPV6PRE:
            {
                if (!bcmolt_epon_oam_buf_write_ipv6_address(buf, this->u.src_ipv6pre.val))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_classif_operator_pack(this->u.src_ipv6pre.op, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_NXT_HDR:
            {
                if (!bcmolt_epon_oam_buf_write(buf, this->u.nxt_hdr.reserved, 15))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.nxt_hdr.val))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_classif_operator_pack(this->u.nxt_hdr.op, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
                if (!bcmolt_epon_oam_buf_write(buf, this->u.def.val, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_classif_operator_pack(this->u.def.op, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_onu_classif_clause_base_get_packed_length(bcmolt_epon_oam_ctc_onu_classif_clause_base *this)
{
    uint32_t count = 1;
    switch (this->field)
    {
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_DA:
            {
                count += 7;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_SA:
            {
                count += 7;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_VLAN_PRI:
            {
                count += 7;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_VLAN_ID:
            {
                count += 7;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_ETH_TYPE:
            {
                count += 7;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_DEST_IP:
            {
                count += 7;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_SOURCE_IP:
            {
                count += 7;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_IP_TYPE:
            {
                count += 7;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_IP_TOS:
            {
                count += 7;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_IP_PREC:
            {
                count += 7;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_SOURCE_PORT:
            {
                count += 7;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_DEST_PORT:
            {
                count += 7;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_IP_VER:
            {
                count += 17;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_IP_FLOW_LABEL:
            {
                count += 17;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_DST_IPV6:
            {
                count += 17;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_SRC_IPV6:
            {
                count += 17;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_DST_IPV6PRE:
            {
                count += 17;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_SRC_IPV6PRE:
            {
                count += 17;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_NXT_HDR:
            {
                count += 17;
            }
            break;
        default:
            {
                count += 17;
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_onu_classif_clause_base_unpack(bcmolt_epon_oam_ctc_onu_classif_clause_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_ctc_onu_classif_field_unpack(&this->field, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->field)
    {
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_DA:
            {
                if (!bcmolt_epon_oam_buf_read_mac_address(buf, &this->u.da.val))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_classif_operator_unpack(&this->u.da.op, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_SA:
            {
                if (!bcmolt_epon_oam_buf_read_mac_address(buf, &this->u.sa.val))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_classif_operator_unpack(&this->u.sa.op, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_VLAN_PRI:
            {
                if (!bcmolt_epon_oam_buf_read(buf, this->u.vlan_pri.reserved, 5))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.vlan_pri.val))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_classif_operator_unpack(&this->u.vlan_pri.op, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_VLAN_ID:
            {
                if (!bcmolt_epon_oam_buf_read(buf, this->u.vlan_id.reserved, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.vlan_id.val))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_classif_operator_unpack(&this->u.vlan_id.op, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_ETH_TYPE:
            {
                if (!bcmolt_epon_oam_buf_read(buf, this->u.eth_type.reserved, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.eth_type.val))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_classif_operator_unpack(&this->u.eth_type.op, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_DEST_IP:
            {
                if (!bcmolt_epon_oam_buf_read(buf, this->u.dest_ip.reserved, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_ipv4_address(buf, &this->u.dest_ip.val))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_classif_operator_unpack(&this->u.dest_ip.op, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_SOURCE_IP:
            {
                if (!bcmolt_epon_oam_buf_read(buf, this->u.source_ip.reserved, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_ipv4_address(buf, &this->u.source_ip.val))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_classif_operator_unpack(&this->u.source_ip.op, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_IP_TYPE:
            {
                if (!bcmolt_epon_oam_buf_read(buf, this->u.ip_type.reserved, 5))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.ip_type.val))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_classif_operator_unpack(&this->u.ip_type.op, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_IP_TOS:
            {
                if (!bcmolt_epon_oam_buf_read(buf, this->u.ip_tos.reserved, 5))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.ip_tos.val))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_classif_operator_unpack(&this->u.ip_tos.op, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_IP_PREC:
            {
                if (!bcmolt_epon_oam_buf_read(buf, this->u.ip_prec.reserved, 5))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.ip_prec.val))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_classif_operator_unpack(&this->u.ip_prec.op, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_SOURCE_PORT:
            {
                if (!bcmolt_epon_oam_buf_read(buf, this->u.source_port.reserved, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.source_port.val))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_classif_operator_unpack(&this->u.source_port.op, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_DEST_PORT:
            {
                if (!bcmolt_epon_oam_buf_read(buf, this->u.dest_port.reserved, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.dest_port.val))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_classif_operator_unpack(&this->u.dest_port.op, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_IP_VER:
            {
                if (!bcmolt_epon_oam_buf_read(buf, this->u.ip_ver.reserved, 15))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.ip_ver.val))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_classif_operator_unpack(&this->u.ip_ver.op, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_IP_FLOW_LABEL:
            {
                if (!bcmolt_epon_oam_buf_read(buf, this->u.ip_flow_label.reserved, 12))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(buf, &this->u.ip_flow_label.val))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_classif_operator_unpack(&this->u.ip_flow_label.op, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_DST_IPV6:
            {
                if (!bcmolt_epon_oam_buf_read_ipv6_address(buf, &this->u.dst_ipv6.val))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_classif_operator_unpack(&this->u.dst_ipv6.op, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_SRC_IPV6:
            {
                if (!bcmolt_epon_oam_buf_read_ipv6_address(buf, &this->u.src_ipv6.val))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_classif_operator_unpack(&this->u.src_ipv6.op, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_DST_IPV6PRE:
            {
                if (!bcmolt_epon_oam_buf_read_ipv6_address(buf, &this->u.dst_ipv6pre.val))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_classif_operator_unpack(&this->u.dst_ipv6pre.op, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_SRC_IPV6PRE:
            {
                if (!bcmolt_epon_oam_buf_read_ipv6_address(buf, &this->u.src_ipv6pre.val))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_classif_operator_unpack(&this->u.src_ipv6pre.op, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_NXT_HDR:
            {
                if (!bcmolt_epon_oam_buf_read(buf, this->u.nxt_hdr.reserved, 15))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.nxt_hdr.val))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_classif_operator_unpack(&this->u.nxt_hdr.op, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
                if (!bcmolt_epon_oam_buf_read(buf, this->u.def.val, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_classif_operator_unpack(&this->u.def.op, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_onu_classif_clause_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_ctc_onu_classif_field field;
    if (!bcmolt_epon_oam_ctc_onu_classif_field_unpack(&field, packed))
    {
        return BCMOS_FALSE;
    }

    switch (field)
    {
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_DA:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 6))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_SA:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 6))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_VLAN_PRI:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 5))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_VLAN_ID:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_ETH_TYPE:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_DEST_IP:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_SOURCE_IP:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_IP_TYPE:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 5))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_IP_TOS:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 5))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_IP_PREC:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 5))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_SOURCE_PORT:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_DEST_PORT:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_IP_VER:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 15))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_IP_FLOW_LABEL:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 12))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_DST_IPV6:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_SRC_IPV6:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_DST_IPV6PRE:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_SRC_IPV6PRE:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_ONU_CLASSIF_FIELD_NXT_HDR:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 15))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_rule_pack(bcmolt_epon_oam_ctc_rule *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t preLenFieldPos;
    uint32_t bytesAfterLenField;
    uint8_t i0;
    if (!bcmolt_epon_oam_buf_write_u8(buf, this->precedence))
    {
        return BCMOS_FALSE;
    }

    preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

    /* skip over length field (we'll fill it in later) */
    if (!bcmolt_epon_oam_buf_skip(buf, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->queue))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->pri_marking))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->clauses_count))
    {
        return BCMOS_FALSE;
    }

    if ((this->clauses_count > 0) && (this->clauses == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"clauses\" of struct \"bcmolt_epon_oam_ctc_rule\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->clauses_count; i0++)
    {
        if (!bcmolt_epon_oam_ctc_onu_classif_clause_base_pack(&this->clauses[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
    if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, bytesAfterLenField))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_rule_get_packed_length(bcmolt_epon_oam_ctc_rule *this)
{
    uint32_t count = 5;
    uint32_t i0;
    if ((this->clauses_count > 0) && (this->clauses == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"clauses_count\" of struct \"bcmolt_epon_oam_ctc_rule\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return 0;
    }

    for (i0 = 0; i0 < this->clauses_count; i0++)
    {
        count += bcmolt_epon_oam_ctc_onu_classif_clause_base_get_packed_length(&this->clauses[i0]);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_rule_unpack(bcmolt_epon_oam_ctc_rule *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint8_t length = 0;
    bcmolt_epon_oam_buf postLenBuf;
    uint8_t i0;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->precedence))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, buf->curr);
    if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->queue))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->pri_marking))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->clauses_count))
    {
        return BCMOS_FALSE;
    }

    if ((this->clauses_count > 0) && (this->clauses == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"clauses\" of struct \"bcmolt_epon_oam_ctc_rule\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->clauses = (bcmolt_epon_oam_ctc_onu_classif_clause_base *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->clauses_count * sizeof(bcmolt_epon_oam_ctc_onu_classif_clause_base));
        }
    }

    for (i0 = 0; i0 < this->clauses_count; i0++)
    {
        if (!bcmolt_epon_oam_ctc_onu_classif_clause_base_unpack(&this->clauses[i0], &postLenBuf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if (!bcmolt_epon_oam_buf_skip(buf, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_rule_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_buf postLenBuf;
    uint8_t length;
    uint8_t clauses_count;
    uint8_t i0;
    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, packed->curr);
    if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &clauses_count))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_ctc_onu_classif_clause_base) * clauses_count);
    for (i0 = 0; i0 < clauses_count; i0++)
    {
        if (!bcmolt_epon_oam_ctc_onu_classif_clause_base_scan(&postLenBuf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if (!bcmolt_epon_oam_buf_skip(packed, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_multicast_vlan_prov_pack(bcmolt_epon_oam_ctc_multicast_vlan_prov *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_ctc_multicast_vlan_operation_pack(this->operation, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->operation)
    {
        case BCMOLT_EPON_OAM_CTC_MULTICAST_VLAN_OPERATION_DELETE:
            {
                uint32_t i0;
                if ((this->u.delete.multicast_vlans_count > 0) && (this->u.delete.multicast_vlans == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"multicast_vlans\" of struct \"bcmolt_epon_oam_ctc_multicast_vlan_prov_delete\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i0 = 0; i0 < this->u.delete.multicast_vlans_count; i0++)
                {
                    if (!bcmolt_epon_oam_buf_write_vlan_tag(buf, this->u.delete.multicast_vlans[i0]))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MULTICAST_VLAN_OPERATION_ADD:
            {
                uint32_t i1;
                if ((this->u.add.multicast_vlans_count > 0) && (this->u.add.multicast_vlans == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"multicast_vlans\" of struct \"bcmolt_epon_oam_ctc_multicast_vlan_prov_add\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i1 = 0; i1 < this->u.add.multicast_vlans_count; i1++)
                {
                    if (!bcmolt_epon_oam_buf_write_vlan_tag(buf, this->u.add.multicast_vlans[i1]))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MULTICAST_VLAN_OPERATION_CLEAR:
            {
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MULTICAST_VLAN_OPERATION_LIST:
            {
                uint32_t i2;
                if ((this->u.list.multicast_vlans_count > 0) && (this->u.list.multicast_vlans == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"multicast_vlans\" of struct \"bcmolt_epon_oam_ctc_multicast_vlan_prov_list\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i2 = 0; i2 < this->u.list.multicast_vlans_count; i2++)
                {
                    if (!bcmolt_epon_oam_buf_write_vlan_tag(buf, this->u.list.multicast_vlans[i2]))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_multicast_vlan_prov_get_packed_length(bcmolt_epon_oam_ctc_multicast_vlan_prov *this)
{
    uint32_t count = 1;
    switch (this->operation)
    {
        case BCMOLT_EPON_OAM_CTC_MULTICAST_VLAN_OPERATION_DELETE:
            {
                count += (2 * this->u.delete.multicast_vlans_count);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MULTICAST_VLAN_OPERATION_ADD:
            {
                count += (2 * this->u.add.multicast_vlans_count);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MULTICAST_VLAN_OPERATION_CLEAR:
            {
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MULTICAST_VLAN_OPERATION_LIST:
            {
                count += (2 * this->u.list.multicast_vlans_count);
            }
            break;
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_multicast_vlan_prov_unpack(bcmolt_epon_oam_ctc_multicast_vlan_prov *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_ctc_multicast_vlan_operation_unpack(&this->operation, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->operation)
    {
        case BCMOLT_EPON_OAM_CTC_MULTICAST_VLAN_OPERATION_DELETE:
            {
                uint32_t i0;
                this->u.delete.multicast_vlans_count = bcmolt_epon_oam_ctc_multicast_vlan_prov_delete_count_multicast_vlans(buf);
                if ((this->u.delete.multicast_vlans_count > 0) && (this->u.delete.multicast_vlans == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"multicast_vlans\" of struct \"bcmolt_epon_oam_ctc_multicast_vlan_prov_delete\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.delete.multicast_vlans = (bcmos_vlan_tag *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.delete.multicast_vlans_count * sizeof(bcmos_vlan_tag));
                    }
                }

                for (i0 = 0; i0 < this->u.delete.multicast_vlans_count; i0++)
                {
                    if (!bcmolt_epon_oam_buf_read_vlan_tag(buf, &this->u.delete.multicast_vlans[i0]))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MULTICAST_VLAN_OPERATION_ADD:
            {
                uint32_t i1;
                this->u.add.multicast_vlans_count = bcmolt_epon_oam_ctc_multicast_vlan_prov_add_count_multicast_vlans(buf);
                if ((this->u.add.multicast_vlans_count > 0) && (this->u.add.multicast_vlans == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"multicast_vlans\" of struct \"bcmolt_epon_oam_ctc_multicast_vlan_prov_add\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.add.multicast_vlans = (bcmos_vlan_tag *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.add.multicast_vlans_count * sizeof(bcmos_vlan_tag));
                    }
                }

                for (i1 = 0; i1 < this->u.add.multicast_vlans_count; i1++)
                {
                    if (!bcmolt_epon_oam_buf_read_vlan_tag(buf, &this->u.add.multicast_vlans[i1]))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MULTICAST_VLAN_OPERATION_CLEAR:
            {
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MULTICAST_VLAN_OPERATION_LIST:
            {
                uint32_t i2;
                this->u.list.multicast_vlans_count = bcmolt_epon_oam_ctc_multicast_vlan_prov_list_count_multicast_vlans(buf);
                if ((this->u.list.multicast_vlans_count > 0) && (this->u.list.multicast_vlans == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"multicast_vlans\" of struct \"bcmolt_epon_oam_ctc_multicast_vlan_prov_list\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.list.multicast_vlans = (bcmos_vlan_tag *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.list.multicast_vlans_count * sizeof(bcmos_vlan_tag));
                    }
                }

                for (i2 = 0; i2 < this->u.list.multicast_vlans_count; i2++)
                {
                    if (!bcmolt_epon_oam_buf_read_vlan_tag(buf, &this->u.list.multicast_vlans[i2]))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_multicast_vlan_prov_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_ctc_multicast_vlan_operation operation;
    if (!bcmolt_epon_oam_ctc_multicast_vlan_operation_unpack(&operation, packed))
    {
        return BCMOS_FALSE;
    }

    switch (operation)
    {
        case BCMOLT_EPON_OAM_CTC_MULTICAST_VLAN_OPERATION_DELETE:
            {
                uint32_t multicast_vlans_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(packed, 2))
                    {
                        break;
                    }

                    multicast_vlans_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(multicast_vlans_elem_count * sizeof(bcmos_vlan_tag));
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MULTICAST_VLAN_OPERATION_ADD:
            {
                uint32_t multicast_vlans_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(packed, 2))
                    {
                        break;
                    }

                    multicast_vlans_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(multicast_vlans_elem_count * sizeof(bcmos_vlan_tag));
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MULTICAST_VLAN_OPERATION_CLEAR:
            {
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MULTICAST_VLAN_OPERATION_LIST:
            {
                uint32_t multicast_vlans_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(packed, 2))
                    {
                        break;
                    }

                    multicast_vlans_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(multicast_vlans_elem_count * sizeof(bcmos_vlan_tag));
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_multicast_vlan_prov_delete_count_multicast_vlans(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 2);
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_multicast_vlan_prov_add_count_multicast_vlans(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 2);
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_multicast_vlan_prov_list_count_multicast_vlans(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 2);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_iptv_vlan_entry_pack(bcmolt_epon_oam_ctc_iptv_vlan_entry *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_vlan_tag(buf, this->multicast_vlan))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_vlan_tag(buf, this->iptv_user_vlan))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_iptv_vlan_entry_unpack(bcmolt_epon_oam_ctc_iptv_vlan_entry *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_vlan_tag(buf, &this->multicast_vlan))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_vlan_tag(buf, &this->iptv_user_vlan))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_iptv_vlan_entry_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 4);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_multicast_tag_operation_base_pack(bcmolt_epon_oam_ctc_multicast_tag_operation_base *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_ctc_multicast_tag_mode_pack(this->tag_mode, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->tag_mode)
    {
        case BCMOLT_EPON_OAM_CTC_MULTICAST_TAG_MODE_DO_NOT_STRIP:
            {
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MULTICAST_TAG_MODE_STRIP_DATA_QUERY:
            {
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MULTICAST_TAG_MODE_STRIP_DATA_QUERY_IPTV:
            {
                uint8_t i0;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.strip_data_query_iptv.multicast_vlans_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.strip_data_query_iptv.multicast_vlans_count > 0) && (this->u.strip_data_query_iptv.multicast_vlans == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"multicast_vlans\" of struct \"bcmolt_epon_oam_ctc_multicast_tag_operation_base_strip_data_query_iptv\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i0 = 0; i0 < this->u.strip_data_query_iptv.multicast_vlans_count; i0++)
                {
                    if (!bcmolt_epon_oam_ctc_iptv_vlan_entry_pack(&this->u.strip_data_query_iptv.multicast_vlans[i0], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_multicast_tag_operation_base_get_packed_length(bcmolt_epon_oam_ctc_multicast_tag_operation_base *this)
{
    uint32_t count = 1;
    switch (this->tag_mode)
    {
        case BCMOLT_EPON_OAM_CTC_MULTICAST_TAG_MODE_DO_NOT_STRIP:
            {
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MULTICAST_TAG_MODE_STRIP_DATA_QUERY:
            {
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MULTICAST_TAG_MODE_STRIP_DATA_QUERY_IPTV:
            {
                count += 1 + (4 * this->u.strip_data_query_iptv.multicast_vlans_count);
            }
            break;
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_multicast_tag_operation_base_unpack(bcmolt_epon_oam_ctc_multicast_tag_operation_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_ctc_multicast_tag_mode_unpack(&this->tag_mode, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->tag_mode)
    {
        case BCMOLT_EPON_OAM_CTC_MULTICAST_TAG_MODE_DO_NOT_STRIP:
            {
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MULTICAST_TAG_MODE_STRIP_DATA_QUERY:
            {
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MULTICAST_TAG_MODE_STRIP_DATA_QUERY_IPTV:
            {
                uint8_t i0;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.strip_data_query_iptv.multicast_vlans_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.strip_data_query_iptv.multicast_vlans_count > 0) && (this->u.strip_data_query_iptv.multicast_vlans == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"multicast_vlans\" of struct \"bcmolt_epon_oam_ctc_multicast_tag_operation_base_strip_data_query_iptv\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.strip_data_query_iptv.multicast_vlans = (bcmolt_epon_oam_ctc_iptv_vlan_entry *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.strip_data_query_iptv.multicast_vlans_count * sizeof(bcmolt_epon_oam_ctc_iptv_vlan_entry));
                    }
                }

                for (i0 = 0; i0 < this->u.strip_data_query_iptv.multicast_vlans_count; i0++)
                {
                    if (!bcmolt_epon_oam_ctc_iptv_vlan_entry_unpack(&this->u.strip_data_query_iptv.multicast_vlans[i0], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_multicast_tag_operation_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_ctc_multicast_tag_mode tag_mode;
    if (!bcmolt_epon_oam_ctc_multicast_tag_mode_unpack(&tag_mode, packed))
    {
        return BCMOS_FALSE;
    }

    switch (tag_mode)
    {
        case BCMOLT_EPON_OAM_CTC_MULTICAST_TAG_MODE_DO_NOT_STRIP:
            {
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MULTICAST_TAG_MODE_STRIP_DATA_QUERY:
            {
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MULTICAST_TAG_MODE_STRIP_DATA_QUERY_IPTV:
            {
                uint8_t multicast_vlans_count;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &multicast_vlans_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_ctc_iptv_vlan_entry) * multicast_vlans_count);
                if (!bcmolt_epon_oam_buf_skip(packed, multicast_vlans_count * 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_multicast_control_entry_gda_mac_only_pack(bcmolt_epon_oam_ctc_multicast_control_entry_gda_mac_only *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u16(buf, this->user_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->reserved))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_mac_address(buf, this->group_mac_address))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_multicast_control_entry_gda_mac_only_unpack(bcmolt_epon_oam_ctc_multicast_control_entry_gda_mac_only *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->user_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->reserved))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_mac_address(buf, &this->group_mac_address))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_multicast_control_entry_gda_mac_only_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 10);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_multicast_control_entry_gda_mac_plus_vlan_id_pack(bcmolt_epon_oam_ctc_multicast_control_entry_gda_mac_plus_vlan_id *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u16(buf, this->user_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->multicast_vlan))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_mac_address(buf, this->group_mac_address))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_multicast_control_entry_gda_mac_plus_vlan_id_unpack(bcmolt_epon_oam_ctc_multicast_control_entry_gda_mac_plus_vlan_id *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->user_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->multicast_vlan))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_mac_address(buf, &this->group_mac_address))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_multicast_control_entry_gda_mac_plus_vlan_id_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 10);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_multicast_control_entry_gda_mac_plus_ipv4sa_pack(bcmolt_epon_oam_ctc_multicast_control_entry_gda_mac_plus_ipv4sa *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u16(buf, this->user_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_mac_address(buf, this->group_mac_address))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_ipv4_address(buf, this->ipsource_address))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_multicast_control_entry_gda_mac_plus_ipv4sa_unpack(bcmolt_epon_oam_ctc_multicast_control_entry_gda_mac_plus_ipv4sa *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->user_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_mac_address(buf, &this->group_mac_address))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_ipv4_address(buf, &this->ipsource_address))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_multicast_control_entry_gda_mac_plus_ipv4sa_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 12);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_multicast_control_entry_gda_ipplus_mcast_vlan_id_pack(bcmolt_epon_oam_ctc_multicast_control_entry_gda_ipplus_mcast_vlan_id *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u16(buf, this->user_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->multicast_vlan))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->reserved))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_ipv4_address(buf, this->ipmulticast_address))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_multicast_control_entry_gda_ipplus_mcast_vlan_id_unpack(bcmolt_epon_oam_ctc_multicast_control_entry_gda_ipplus_mcast_vlan_id *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->user_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->multicast_vlan))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->reserved))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_ipv4_address(buf, &this->ipmulticast_address))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_multicast_control_entry_gda_ipplus_mcast_vlan_id_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 10);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_multicast_control_entry_gda_ipv6plus_mcast_vlan_id_pack(bcmolt_epon_oam_ctc_multicast_control_entry_gda_ipv6plus_mcast_vlan_id *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u16(buf, this->user_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->multicast_vlan))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_ipv6_address(buf, this->ipv6multicast_address))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_multicast_control_entry_gda_ipv6plus_mcast_vlan_id_unpack(bcmolt_epon_oam_ctc_multicast_control_entry_gda_ipv6plus_mcast_vlan_id *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->user_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->multicast_vlan))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_ipv6_address(buf, &this->ipv6multicast_address))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_multicast_control_entry_gda_ipv6plus_mcast_vlan_id_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 20);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_multicast_control_entry_gda_mac_plus_ipv6sa_pack(bcmolt_epon_oam_ctc_multicast_control_entry_gda_mac_plus_ipv6sa *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u16(buf, this->user_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_mac_address(buf, this->group_mac_address))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_ipv6_address(buf, this->ipsource_address))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_multicast_control_entry_gda_mac_plus_ipv6sa_unpack(bcmolt_epon_oam_ctc_multicast_control_entry_gda_mac_plus_ipv6sa *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->user_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_mac_address(buf, &this->group_mac_address))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_ipv6_address(buf, &this->ipsource_address))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_multicast_control_entry_gda_mac_plus_ipv6sa_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 24);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_multicast_control_pack(bcmolt_epon_oam_ctc_multicast_control *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_ctc_multicast_control_action_pack(this->action, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_ctc_multicast_control_type_pack(this->type, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->type)
    {
        case BCMOLT_EPON_OAM_CTC_MULTICAST_CONTROL_TYPE_GDA_MAC_ONLY:
            {
                uint32_t i0;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.gda_mac_only.total_entries_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.gda_mac_only.entries_count > 0) && (this->u.gda_mac_only.entries == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"entries\" of struct \"bcmolt_epon_oam_ctc_multicast_control_gda_mac_only\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i0 = 0; i0 < this->u.gda_mac_only.entries_count; i0++)
                {
                    if (!bcmolt_epon_oam_ctc_multicast_control_entry_gda_mac_only_pack(&this->u.gda_mac_only.entries[i0], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MULTICAST_CONTROL_TYPE_GDA_MAC_PLUS_VLAN_ID:
            {
                uint32_t i1;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.gda_mac_plus_vlan_id.total_entries_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.gda_mac_plus_vlan_id.entries_count > 0) && (this->u.gda_mac_plus_vlan_id.entries == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"entries\" of struct \"bcmolt_epon_oam_ctc_multicast_control_gda_mac_plus_vlan_id\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i1 = 0; i1 < this->u.gda_mac_plus_vlan_id.entries_count; i1++)
                {
                    if (!bcmolt_epon_oam_ctc_multicast_control_entry_gda_mac_plus_vlan_id_pack(&this->u.gda_mac_plus_vlan_id.entries[i1], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MULTICAST_CONTROL_TYPE_GDA_MAC_PLUS_IPV4SA:
            {
                uint32_t i2;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.gda_mac_plus_ipv4sa.total_entries_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.gda_mac_plus_ipv4sa.entries_count > 0) && (this->u.gda_mac_plus_ipv4sa.entries == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"entries\" of struct \"bcmolt_epon_oam_ctc_multicast_control_gda_mac_plus_ipv4sa\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i2 = 0; i2 < this->u.gda_mac_plus_ipv4sa.entries_count; i2++)
                {
                    if (!bcmolt_epon_oam_ctc_multicast_control_entry_gda_mac_plus_ipv4sa_pack(&this->u.gda_mac_plus_ipv4sa.entries[i2], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MULTICAST_CONTROL_TYPE_GDA_IPPLUS_MCAST_VLAN_ID:
            {
                uint32_t i3;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.gda_ipplus_mcast_vlan_id.total_entries_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.gda_ipplus_mcast_vlan_id.entries_count > 0) && (this->u.gda_ipplus_mcast_vlan_id.entries == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"entries\" of struct \"bcmolt_epon_oam_ctc_multicast_control_gda_ipplus_mcast_vlan_id\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i3 = 0; i3 < this->u.gda_ipplus_mcast_vlan_id.entries_count; i3++)
                {
                    if (!bcmolt_epon_oam_ctc_multicast_control_entry_gda_ipplus_mcast_vlan_id_pack(&this->u.gda_ipplus_mcast_vlan_id.entries[i3], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MULTICAST_CONTROL_TYPE_GDA_IPV6PLUS_MCAST_VLAN_ID:
            {
                uint32_t i4;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.gda_ipv6plus_mcast_vlan_id.total_entries_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.gda_ipv6plus_mcast_vlan_id.entries_count > 0) && (this->u.gda_ipv6plus_mcast_vlan_id.entries == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"entries\" of struct \"bcmolt_epon_oam_ctc_multicast_control_gda_ipv6plus_mcast_vlan_id\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i4 = 0; i4 < this->u.gda_ipv6plus_mcast_vlan_id.entries_count; i4++)
                {
                    if (!bcmolt_epon_oam_ctc_multicast_control_entry_gda_ipv6plus_mcast_vlan_id_pack(&this->u.gda_ipv6plus_mcast_vlan_id.entries[i4], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MULTICAST_CONTROL_TYPE_GDA_MAC_PLUS_IPV6SA:
            {
                uint32_t i5;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.gda_mac_plus_ipv6sa.total_entries_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.gda_mac_plus_ipv6sa.entries_count > 0) && (this->u.gda_mac_plus_ipv6sa.entries == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"entries\" of struct \"bcmolt_epon_oam_ctc_multicast_control_gda_mac_plus_ipv6sa\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i5 = 0; i5 < this->u.gda_mac_plus_ipv6sa.entries_count; i5++)
                {
                    if (!bcmolt_epon_oam_ctc_multicast_control_entry_gda_mac_plus_ipv6sa_pack(&this->u.gda_mac_plus_ipv6sa.entries[i5], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_multicast_control_get_packed_length(bcmolt_epon_oam_ctc_multicast_control *this)
{
    uint32_t count = 2;
    switch (this->type)
    {
        case BCMOLT_EPON_OAM_CTC_MULTICAST_CONTROL_TYPE_GDA_MAC_ONLY:
            {
                count += 1 + (10 * this->u.gda_mac_only.entries_count);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MULTICAST_CONTROL_TYPE_GDA_MAC_PLUS_VLAN_ID:
            {
                count += 1 + (10 * this->u.gda_mac_plus_vlan_id.entries_count);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MULTICAST_CONTROL_TYPE_GDA_MAC_PLUS_IPV4SA:
            {
                count += 1 + (12 * this->u.gda_mac_plus_ipv4sa.entries_count);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MULTICAST_CONTROL_TYPE_GDA_IPPLUS_MCAST_VLAN_ID:
            {
                count += 1 + (10 * this->u.gda_ipplus_mcast_vlan_id.entries_count);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MULTICAST_CONTROL_TYPE_GDA_IPV6PLUS_MCAST_VLAN_ID:
            {
                count += 1 + (20 * this->u.gda_ipv6plus_mcast_vlan_id.entries_count);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MULTICAST_CONTROL_TYPE_GDA_MAC_PLUS_IPV6SA:
            {
                count += 1 + (24 * this->u.gda_mac_plus_ipv6sa.entries_count);
            }
            break;
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_multicast_control_unpack(bcmolt_epon_oam_ctc_multicast_control *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_ctc_multicast_control_action_unpack(&this->action, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_ctc_multicast_control_type_unpack(&this->type, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->type)
    {
        case BCMOLT_EPON_OAM_CTC_MULTICAST_CONTROL_TYPE_GDA_MAC_ONLY:
            {
                uint32_t i0;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.gda_mac_only.total_entries_count))
                {
                    return BCMOS_FALSE;
                }

                this->u.gda_mac_only.entries_count = bcmolt_epon_oam_ctc_multicast_control_gda_mac_only_count_entries(buf);
                if ((this->u.gda_mac_only.entries_count > 0) && (this->u.gda_mac_only.entries == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"entries\" of struct \"bcmolt_epon_oam_ctc_multicast_control_gda_mac_only\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.gda_mac_only.entries = (bcmolt_epon_oam_ctc_multicast_control_entry_gda_mac_only *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.gda_mac_only.entries_count * sizeof(bcmolt_epon_oam_ctc_multicast_control_entry_gda_mac_only));
                    }
                }

                for (i0 = 0; i0 < this->u.gda_mac_only.entries_count; i0++)
                {
                    if (!bcmolt_epon_oam_ctc_multicast_control_entry_gda_mac_only_unpack(&this->u.gda_mac_only.entries[i0], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MULTICAST_CONTROL_TYPE_GDA_MAC_PLUS_VLAN_ID:
            {
                uint32_t i1;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.gda_mac_plus_vlan_id.total_entries_count))
                {
                    return BCMOS_FALSE;
                }

                this->u.gda_mac_plus_vlan_id.entries_count = bcmolt_epon_oam_ctc_multicast_control_gda_mac_plus_vlan_id_count_entries(buf);
                if ((this->u.gda_mac_plus_vlan_id.entries_count > 0) && (this->u.gda_mac_plus_vlan_id.entries == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"entries\" of struct \"bcmolt_epon_oam_ctc_multicast_control_gda_mac_plus_vlan_id\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.gda_mac_plus_vlan_id.entries = (bcmolt_epon_oam_ctc_multicast_control_entry_gda_mac_plus_vlan_id *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.gda_mac_plus_vlan_id.entries_count * sizeof(bcmolt_epon_oam_ctc_multicast_control_entry_gda_mac_plus_vlan_id));
                    }
                }

                for (i1 = 0; i1 < this->u.gda_mac_plus_vlan_id.entries_count; i1++)
                {
                    if (!bcmolt_epon_oam_ctc_multicast_control_entry_gda_mac_plus_vlan_id_unpack(&this->u.gda_mac_plus_vlan_id.entries[i1], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MULTICAST_CONTROL_TYPE_GDA_MAC_PLUS_IPV4SA:
            {
                uint32_t i2;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.gda_mac_plus_ipv4sa.total_entries_count))
                {
                    return BCMOS_FALSE;
                }

                this->u.gda_mac_plus_ipv4sa.entries_count = bcmolt_epon_oam_ctc_multicast_control_gda_mac_plus_ipv4sa_count_entries(buf);
                if ((this->u.gda_mac_plus_ipv4sa.entries_count > 0) && (this->u.gda_mac_plus_ipv4sa.entries == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"entries\" of struct \"bcmolt_epon_oam_ctc_multicast_control_gda_mac_plus_ipv4sa\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.gda_mac_plus_ipv4sa.entries = (bcmolt_epon_oam_ctc_multicast_control_entry_gda_mac_plus_ipv4sa *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.gda_mac_plus_ipv4sa.entries_count * sizeof(bcmolt_epon_oam_ctc_multicast_control_entry_gda_mac_plus_ipv4sa));
                    }
                }

                for (i2 = 0; i2 < this->u.gda_mac_plus_ipv4sa.entries_count; i2++)
                {
                    if (!bcmolt_epon_oam_ctc_multicast_control_entry_gda_mac_plus_ipv4sa_unpack(&this->u.gda_mac_plus_ipv4sa.entries[i2], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MULTICAST_CONTROL_TYPE_GDA_IPPLUS_MCAST_VLAN_ID:
            {
                uint32_t i3;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.gda_ipplus_mcast_vlan_id.total_entries_count))
                {
                    return BCMOS_FALSE;
                }

                this->u.gda_ipplus_mcast_vlan_id.entries_count = bcmolt_epon_oam_ctc_multicast_control_gda_ipplus_mcast_vlan_id_count_entries(buf);
                if ((this->u.gda_ipplus_mcast_vlan_id.entries_count > 0) && (this->u.gda_ipplus_mcast_vlan_id.entries == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"entries\" of struct \"bcmolt_epon_oam_ctc_multicast_control_gda_ipplus_mcast_vlan_id\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.gda_ipplus_mcast_vlan_id.entries = (bcmolt_epon_oam_ctc_multicast_control_entry_gda_ipplus_mcast_vlan_id *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.gda_ipplus_mcast_vlan_id.entries_count * sizeof(bcmolt_epon_oam_ctc_multicast_control_entry_gda_ipplus_mcast_vlan_id));
                    }
                }

                for (i3 = 0; i3 < this->u.gda_ipplus_mcast_vlan_id.entries_count; i3++)
                {
                    if (!bcmolt_epon_oam_ctc_multicast_control_entry_gda_ipplus_mcast_vlan_id_unpack(&this->u.gda_ipplus_mcast_vlan_id.entries[i3], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MULTICAST_CONTROL_TYPE_GDA_IPV6PLUS_MCAST_VLAN_ID:
            {
                uint32_t i4;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.gda_ipv6plus_mcast_vlan_id.total_entries_count))
                {
                    return BCMOS_FALSE;
                }

                this->u.gda_ipv6plus_mcast_vlan_id.entries_count = bcmolt_epon_oam_ctc_multicast_control_gda_ipv6plus_mcast_vlan_id_count_entries(buf);
                if ((this->u.gda_ipv6plus_mcast_vlan_id.entries_count > 0) && (this->u.gda_ipv6plus_mcast_vlan_id.entries == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"entries\" of struct \"bcmolt_epon_oam_ctc_multicast_control_gda_ipv6plus_mcast_vlan_id\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.gda_ipv6plus_mcast_vlan_id.entries = (bcmolt_epon_oam_ctc_multicast_control_entry_gda_ipv6plus_mcast_vlan_id *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.gda_ipv6plus_mcast_vlan_id.entries_count * sizeof(bcmolt_epon_oam_ctc_multicast_control_entry_gda_ipv6plus_mcast_vlan_id));
                    }
                }

                for (i4 = 0; i4 < this->u.gda_ipv6plus_mcast_vlan_id.entries_count; i4++)
                {
                    if (!bcmolt_epon_oam_ctc_multicast_control_entry_gda_ipv6plus_mcast_vlan_id_unpack(&this->u.gda_ipv6plus_mcast_vlan_id.entries[i4], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MULTICAST_CONTROL_TYPE_GDA_MAC_PLUS_IPV6SA:
            {
                uint32_t i5;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.gda_mac_plus_ipv6sa.total_entries_count))
                {
                    return BCMOS_FALSE;
                }

                this->u.gda_mac_plus_ipv6sa.entries_count = bcmolt_epon_oam_ctc_multicast_control_gda_mac_plus_ipv6sa_count_entries(buf);
                if ((this->u.gda_mac_plus_ipv6sa.entries_count > 0) && (this->u.gda_mac_plus_ipv6sa.entries == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"entries\" of struct \"bcmolt_epon_oam_ctc_multicast_control_gda_mac_plus_ipv6sa\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.gda_mac_plus_ipv6sa.entries = (bcmolt_epon_oam_ctc_multicast_control_entry_gda_mac_plus_ipv6sa *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.gda_mac_plus_ipv6sa.entries_count * sizeof(bcmolt_epon_oam_ctc_multicast_control_entry_gda_mac_plus_ipv6sa));
                    }
                }

                for (i5 = 0; i5 < this->u.gda_mac_plus_ipv6sa.entries_count; i5++)
                {
                    if (!bcmolt_epon_oam_ctc_multicast_control_entry_gda_mac_plus_ipv6sa_unpack(&this->u.gda_mac_plus_ipv6sa.entries[i5], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_multicast_control_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_ctc_multicast_control_type type;
    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_ctc_multicast_control_type_unpack(&type, packed))
    {
        return BCMOS_FALSE;
    }

    switch (type)
    {
        case BCMOLT_EPON_OAM_CTC_MULTICAST_CONTROL_TYPE_GDA_MAC_ONLY:
            {
                uint32_t entries_elem_count = 0;
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(packed, 10))
                    {
                        break;
                    }

                    entries_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(entries_elem_count * sizeof(bcmolt_epon_oam_ctc_multicast_control_entry_gda_mac_only));
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MULTICAST_CONTROL_TYPE_GDA_MAC_PLUS_VLAN_ID:
            {
                uint32_t entries_elem_count = 0;
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(packed, 10))
                    {
                        break;
                    }

                    entries_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(entries_elem_count * sizeof(bcmolt_epon_oam_ctc_multicast_control_entry_gda_mac_plus_vlan_id));
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MULTICAST_CONTROL_TYPE_GDA_MAC_PLUS_IPV4SA:
            {
                uint32_t entries_elem_count = 0;
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(packed, 12))
                    {
                        break;
                    }

                    entries_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(entries_elem_count * sizeof(bcmolt_epon_oam_ctc_multicast_control_entry_gda_mac_plus_ipv4sa));
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MULTICAST_CONTROL_TYPE_GDA_IPPLUS_MCAST_VLAN_ID:
            {
                uint32_t entries_elem_count = 0;
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(packed, 10))
                    {
                        break;
                    }

                    entries_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(entries_elem_count * sizeof(bcmolt_epon_oam_ctc_multicast_control_entry_gda_ipplus_mcast_vlan_id));
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MULTICAST_CONTROL_TYPE_GDA_IPV6PLUS_MCAST_VLAN_ID:
            {
                uint32_t entries_elem_count = 0;
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(packed, 20))
                    {
                        break;
                    }

                    entries_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(entries_elem_count * sizeof(bcmolt_epon_oam_ctc_multicast_control_entry_gda_ipv6plus_mcast_vlan_id));
            }
            break;
        case BCMOLT_EPON_OAM_CTC_MULTICAST_CONTROL_TYPE_GDA_MAC_PLUS_IPV6SA:
            {
                uint32_t entries_elem_count = 0;
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(packed, 24))
                    {
                        break;
                    }

                    entries_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(entries_elem_count * sizeof(bcmolt_epon_oam_ctc_multicast_control_entry_gda_mac_plus_ipv6sa));
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_multicast_control_gda_mac_only_count_entries(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 10);
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_multicast_control_gda_mac_plus_vlan_id_count_entries(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 10);
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_multicast_control_gda_mac_plus_ipv4sa_count_entries(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 12);
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_multicast_control_gda_ipplus_mcast_vlan_id_count_entries(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 10);
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_multicast_control_gda_ipv6plus_mcast_vlan_id_count_entries(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 20);
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_multicast_control_gda_mac_plus_ipv6sa_count_entries(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 24);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_onu_llid_queue_pack(bcmolt_epon_oam_ctc_onu_llid_queue *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u16(buf, this->queue_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->wrr_weight))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_onu_llid_queue_unpack(bcmolt_epon_oam_ctc_onu_llid_queue *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->queue_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->wrr_weight))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_onu_llid_queue_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 4);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_zte_vlan_mac_pack(bcmolt_epon_oam_zte_vlan_mac *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_vlan_tag(buf, this->vlan_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_mac_address(buf, this->mac_filter))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_zte_vlan_mac_unpack(bcmolt_epon_oam_zte_vlan_mac *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_vlan_tag(buf, &this->vlan_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_mac_address(buf, &this->mac_filter))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_zte_vlan_mac_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 8);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_ext_attribute_value_base_pack(bcmolt_epon_oam_ctc_ext_attribute_value_base *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_ctc_leaf_ext_attribute_pack(this->leaf, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->leaf)
    {
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_PPPO_ETEST_RESULT:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.pppo_etest_result.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.pppo_etest_result.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_pppo_etest_status_pack(this->u.pppo_etest_result.status, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_pppo_etest_fail_reason_pack(this->u.pppo_etest_result.reason, buf))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_PPPO_ETEST_CONFIGURATION:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.pppo_etest_configuration.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.pppo_etest_configuration.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_start_or_stop_indication_pack(this->u.pppo_etest_configuration.start_or_stop, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.pppo_etest_configuration.user_name, 64))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.pppo_etest_configuration.password, 32))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_pppo_eauth_mode_pack(this->u.pppo_etest_configuration.mode, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.pppo_etest_configuration.vlan))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_END:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.end.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.end.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.end.unknown_count > 0) && (this->u.end.unknown == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"unknown\" of struct \"bcmolt_epon_oam_ctc_ext_attribute_value_base_end\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.end.unknown, this->u.end.unknown_count))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_SERIAL_NUMBER:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.onu_serial_number.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_serial_number.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.onu_serial_number.vendor_id, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.onu_serial_number.onu_model))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_mac_address(buf, this->u.onu_serial_number.onu_mac))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.onu_serial_number.hwversion, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.onu_serial_number.swversion, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.onu_serial_number.ext_onu_model, 16))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_FIRMWARE_VERSION:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.firmware_version.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.firmware_version.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.firmware_version.firmware_version_count > 0) && (this->u.firmware_version.firmware_version == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"firmware_version\" of struct \"bcmolt_epon_oam_ctc_ext_attribute_value_base_firmware_version\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.firmware_version.firmware_version, this->u.firmware_version.firmware_version_count))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_CHIPSET_ID:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.chipset_id.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.chipset_id.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.chipset_id.vendor_id))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.chipset_id.chip_model))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.chipset_id.revision))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.chipset_id.design_date, 3))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_CAPABILITIES1:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.onu_capabilities1.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_capabilities1.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_supported_services_pack(this->u.onu_capabilities1.services, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_capabilities1.num_geports))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_capabilities1.gebitmap))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_capabilities1.num_feports))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_capabilities1.febitmap))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_capabilities1.num_pots_ports))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_capabilities1.num_e1ports))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_capabilities1.num_upstream_queues))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_capabilities1.max_queues_per_port_up))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_capabilities1.num_downstream_queues))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_capabilities1.max_queues_per_port_down))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_capabilities1.battery_backup))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_OPTICAL_TRANSCEIVER_DIAGNOSIS:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.optical_transceiver_diagnosis.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.optical_transceiver_diagnosis.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.optical_transceiver_diagnosis.transceiver_temperature))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.optical_transceiver_diagnosis.supply_vcc))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.optical_transceiver_diagnosis.tx_bias_cur))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.optical_transceiver_diagnosis.tx_power_out))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.optical_transceiver_diagnosis.rx_power_in))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_SERVICE_SLA:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.service_sla.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.service_sla.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_service_sla_base_pack(&this->u.service_sla.service_sla, buf))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_CAPABILITIES2:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                uint8_t i0;
                if (this->u.onu_capabilities2.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_capabilities2.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_type_pack(this->u.onu_capabilities2.onu_type, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_capabilities2.num_links))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_protection_type_pack(this->u.onu_capabilities2.protection_type, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_capabilities2.num_pon_ifs))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_capabilities2.num_slots))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_capabilities2.interfaces_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.onu_capabilities2.interfaces_count > 0) && (this->u.onu_capabilities2.interfaces == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"interfaces\" of struct \"bcmolt_epon_oam_ctc_ext_attribute_value_base_onu_capabilities2\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i0 = 0; i0 < this->u.onu_capabilities2.interfaces_count; i0++)
                {
                    if (!bcmolt_epon_oam_ctc_onu_interface_pack(&this->u.onu_capabilities2.interfaces[i0], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }

                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.onu_capabilities2.battery_backup))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_HOLDOVER_CONFIG:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.holdover_config.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.holdover_config.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_enabled_state_pack(this->u.holdover_config.holdover_state, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.holdover_config.holdover_time))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_MXU_MANAGE_GLOBAL_PARAMETER:
            {
                if (!bcmolt_epon_oam_ctc_mxu_global_params_base_pack(&this->u.mxu_manage_global_parameter.params, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_MXU_MANAGE_SNMP_PARAMETER:
            {
                if (!bcmolt_epon_oam_ctc_mxu_snmp_params_base_pack(&this->u.mxu_manage_snmp_parameter.params, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ACTIVE_PON_IFADMIN:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.active_pon_ifadmin.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.active_pon_ifadmin.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.active_pon_ifadmin.pon_number))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_CAPABILITIES3:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.onu_capabilities3.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_capabilities3.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.onu_capabilities3.is_ipv6aware))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_power_supply_control_type_pack(this->u.onu_capabilities3.power_control_type, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_capabilities3.service_sla))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ETH_LINK_STATE:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.eth_link_state.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.eth_link_state.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.eth_link_state.link_state))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ETH_PORT_PAUSE:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.eth_port_pause.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.eth_port_pause.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.eth_port_pause.enabled))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ETH_PORT_POLICING:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.eth_port_policing.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.eth_port_policing.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_eth_port_policing_config_base_pack(&this->u.eth_port_policing.config, buf))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_VOIP_PORT:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.voip_port.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.voip_port.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.voip_port.port_state))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_E1PORT:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.e1port.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.e1port.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.e1port.port_state))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ETH_PORT_DOWN_RATE_LIMITING:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.eth_port_down_rate_limiting.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.eth_port_down_rate_limiting.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.eth_port_down_rate_limiting.rate_limiting_enabled))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u24(buf, this->u.eth_port_down_rate_limiting.cir))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u24(buf, this->u.eth_port_down_rate_limiting.pir))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_PORT_LOOP_DETECT:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.port_loop_detect.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.port_loop_detect.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_enabled_state_pack(this->u.port_loop_detect.state, buf))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_VLAN:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.vlan.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.vlan.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_vlan_prov_base_pack(&this->u.vlan.vlan_info, buf))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_CLASSIFICATION_AND_MARKING:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                uint8_t i1;
                if (this->u.classification_and_marking.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.classification_and_marking.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_classification_operation_pack(this->u.classification_and_marking.op, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.classification_and_marking.rules_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.classification_and_marking.rules_count > 0) && (this->u.classification_and_marking.rules == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"rules\" of struct \"bcmolt_epon_oam_ctc_ext_attribute_value_base_classification_and_marking\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i1 = 0; i1 < this->u.classification_and_marking.rules_count; i1++)
                {
                    if (!bcmolt_epon_oam_ctc_rule_pack(&this->u.classification_and_marking.rules[i1], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_MULTICAST_VLAN:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.multicast_vlan.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.multicast_vlan.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_multicast_vlan_prov_pack(&this->u.multicast_vlan.vlan_info, buf))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_MULTICAST_TAG_OPERATION:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.multicast_tag_operation.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.multicast_tag_operation.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_multicast_tag_operation_base_pack(&this->u.multicast_tag_operation.tag_operation, buf))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_MULTICAST_SWITCH:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.multicast_switch.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.multicast_switch.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_multicast_switch_mode_pack(this->u.multicast_switch.mode, buf))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_MULTICAST_CONTROL:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.multicast_control.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.multicast_control.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_multicast_control_pack(&this->u.multicast_control.value, buf))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_GROUP_MAX:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.group_max.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.group_max.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.group_max.max_groups))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_FAST_LEAVE_ABILITY:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                uint32_t i2;
                if (this->u.fast_leave_ability.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.fast_leave_ability.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.fast_leave_ability.fast_leave_modes_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.fast_leave_ability.fast_leave_modes_count > 0) && (this->u.fast_leave_ability.fast_leave_modes == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"fast_leave_modes\" of struct \"bcmolt_epon_oam_ctc_ext_attribute_value_base_fast_leave_ability\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i2 = 0; i2 < this->u.fast_leave_ability.fast_leave_modes_count; i2++)
                {
                    if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.fast_leave_ability.fast_leave_modes[i2]))
                    {
                        return BCMOS_FALSE;
                    }
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_FAST_LEAVE_ADMIN_STATE:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.fast_leave_admin_state.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.fast_leave_admin_state.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_enabled_state_pack(this->u.fast_leave_admin_state.state, buf))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_LLID_QUEUE_CONFIG:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                uint8_t i3;
                if (this->u.llid_queue_config.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.llid_queue_config.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.llid_queue_config.llid_queue_table_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.llid_queue_config.llid_queue_table_count > 0) && (this->u.llid_queue_config.llid_queue_table == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"llid_queue_table\" of struct \"bcmolt_epon_oam_ctc_ext_attribute_value_base_llid_queue_config\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i3 = 0; i3 < this->u.llid_queue_config.llid_queue_table_count; i3++)
                {
                    if (!bcmolt_epon_oam_ctc_onu_llid_queue_pack(&this->u.llid_queue_config.llid_queue_table[i3], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_IAD_INFORMATION:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.iad_information.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.iad_information.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_mac_address(buf, this->u.iad_information.iad_mac))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_voip_protocol_pack(this->u.iad_information.protocol_support, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.iad_information.iad_software_ver, 32))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.iad_information.iad_software_time, 32))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.iad_information.voip_user_count))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_VOIP_GLOBAL_PARAMETERS:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.voip_global_parameters.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.voip_global_parameters.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_voice_ipmode_pack(this->u.voip_global_parameters.voice_ipmode, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_ipv4_address(buf, this->u.voip_global_parameters.iad_ipaddr))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_ipv4_address(buf, this->u.voip_global_parameters.iad_net_mask))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_ipv4_address(buf, this->u.voip_global_parameters.iad_default_gw))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_pppoe_mode_pack(this->u.voip_global_parameters.pppoe_mode, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.voip_global_parameters.pppoe_username, 32))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.voip_global_parameters.pppoe_password, 32))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_voice_tagging_mode_pack(this->u.voip_global_parameters.tagging_mode, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.voip_global_parameters.voice_cvlan))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.voip_global_parameters.voice_svlan))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.voip_global_parameters.voice_pri))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_H248PARAMETERS:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.h248parameters.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.h248parameters.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.h248parameters.mgport_number))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_ipv4_address(buf, this->u.h248parameters.mgc_ip))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.h248parameters.mgc_com_port))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_ipv4_address(buf, this->u.h248parameters.backup_mgc_ip))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.h248parameters.backup_mgc_com_port))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.h248parameters.use_active_mgc))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_h248reg_mode_pack(this->u.h248parameters.reg_mode, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.h248parameters.mid, 64))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_h248heartbeat_mode_pack(this->u.h248parameters.heartbeat_mode, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.h248parameters.heartbeat_cycle))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.h248parameters.heartbeat_count))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_H248USER_TID_INFORMATION:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.h248user_tid_information.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.h248user_tid_information.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.h248user_tid_information.name, 32))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_H248RTP_TID_CONFIGURATION:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.h248rtp_tid_configuration.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.h248rtp_tid_configuration.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.h248rtp_tid_configuration.num_rtp_tids))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.h248rtp_tid_configuration.prefix, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.h248rtp_tid_configuration.digit_begin))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_rtp_tid_mode_pack(this->u.h248rtp_tid_configuration.rtp_tid_mode, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.h248rtp_tid_configuration.rtp_tid_length))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_H248RTP_TID_INFORMATION:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.h248rtp_tid_information.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.h248rtp_tid_information.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.h248rtp_tid_information.num_rtp_tids))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.h248rtp_tid_information.first_rtp_tid_name, 32))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_SIP_PARAMETERS:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.sip_parameters.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.sip_parameters.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.sip_parameters.mgport_number))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_ipv4_address(buf, this->u.sip_parameters.active_sip_ip))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.sip_parameters.active_sip_com_port))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_ipv4_address(buf, this->u.sip_parameters.backup_sip_ip))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.sip_parameters.backup_sip_com_port))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_ipv4_address(buf, this->u.sip_parameters.active_sip_proxy_server))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_ipv4_address(buf, this->u.sip_parameters.active_sip_registration_server_ip))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.sip_parameters.active_sip_registration_server_com_port))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_ipv4_address(buf, this->u.sip_parameters.backup_sip_reg_ip))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.sip_parameters.backup_sip_reg_com_port))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_ipv4_address(buf, this->u.sip_parameters.outbound_server_ip))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.sip_parameters.outbound_server_port))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.sip_parameters.sip_registration_interval))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.sip_parameters.disable_heartbeat_switch))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.sip_parameters.heartbeat_cycle))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.sip_parameters.heartbeat_count))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_SIP_USER_PARAMETERS:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.sip_user_parameters.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.sip_user_parameters.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.sip_user_parameters.account, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.sip_user_parameters.name, 32))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.sip_user_parameters.password, 16))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_FAX_MODEM_CONFIGURATION:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.fax_modem_configuration.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.fax_modem_configuration.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_voice_t38mode_pack(this->u.fax_modem_configuration.voice_t38enable, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_voice_fax_modem_control_mode_pack(this->u.fax_modem_configuration.voice_fax_modem_control, buf))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_H248IAD_OPERATION_STATUS:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.h248iad_operation_status.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.h248iad_operation_status.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_iad_operation_status_pack(this->u.h248iad_operation_status.iad_operation_status, buf))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_POTS_STATUS:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.pots_status.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.pots_status.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_iad_port_status_pack(this->u.pots_status.iad_port_status, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_iad_port_service_state_pack(this->u.pots_status.iad_port_service_state, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_iad_port_codec_mode_pack(this->u.pots_status.iad_port_codec_mode, buf))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_IAD_OPERATION:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.iad_operation.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.iad_operation.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_iad_operation_pack(this->u.iad_operation.iad_operation, buf))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_SIP_DIGIT_MAP:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.sip_digit_map.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.sip_digit_map.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.sip_digit_map.sip_digital_map_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.sip_digit_map.sip_digital_map_count > 0) && (this->u.sip_digit_map.sip_digital_map == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"sip_digital_map\" of struct \"bcmolt_epon_oam_ctc_ext_attribute_value_base_sip_digit_map\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.sip_digit_map.sip_digital_map, this->u.sip_digit_map.sip_digital_map_count))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ALARM_ADMIN_STATE:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.alarm_admin_state.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.alarm_admin_state.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_alarm_id_pack(this->u.alarm_admin_state.id, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_enabled_state_pack(this->u.alarm_admin_state.config, buf))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ALARM_THRESHOLD:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.alarm_threshold.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.alarm_threshold.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_alarm_id_pack(this->u.alarm_threshold.id, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.alarm_threshold.threshold))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.alarm_threshold.clearing_threshold))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_VERSION_SERVER_PARA:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.version_server_para.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.version_server_para.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_ipv4_address(buf, this->u.version_server_para.ipaddress))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_ipv4_address(buf, this->u.version_server_para.ipmask))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_ipv4_address(buf, this->u.version_server_para.gateway))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_vlan_tag(buf, this->u.version_server_para.vlan_id))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.version_server_para.user_name, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.version_server_para.password, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.version_server_para.action))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.version_server_para.version_number))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.version_server_para.ver1name, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.version_server_para.ver2name, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.version_server_para.ver3name, 16))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_MAC_LIMIT:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.onu_mac_limit.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_mac_limit.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.onu_mac_limit.mac_limit_number))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_MAC_AGING_TIME:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.onu_mac_aging_time.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_mac_aging_time.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.onu_mac_aging_time.mac_aging_time))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PORT_MAC_FILTER:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                uint8_t i4;
                if (this->u.onu_port_mac_filter.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_port_mac_filter.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_zte_onu_port_mac_operation_pack(this->u.onu_port_mac_filter.op, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_port_mac_filter.number_of_entries))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.onu_port_mac_filter.number_of_entries > 0) && (this->u.onu_port_mac_filter.clause == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"clause\" of struct \"bcmolt_epon_oam_ctc_ext_attribute_value_base_onu_port_mac_filter\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i4 = 0; i4 < this->u.onu_port_mac_filter.number_of_entries; i4++)
                {
                    if (!bcmolt_epon_oam_zte_vlan_mac_pack(&this->u.onu_port_mac_filter.clause[i4], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PORT_MAC_BINDING:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                uint8_t i5;
                if (this->u.onu_port_mac_binding.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_port_mac_binding.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_zte_onu_port_mac_operation_pack(this->u.onu_port_mac_binding.op, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_port_mac_binding.number_of_entries))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.onu_port_mac_binding.number_of_entries > 0) && (this->u.onu_port_mac_binding.clause == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"clause\" of struct \"bcmolt_epon_oam_ctc_ext_attribute_value_base_onu_port_mac_binding\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i5 = 0; i5 < this->u.onu_port_mac_binding.number_of_entries; i5++)
                {
                    if (!bcmolt_epon_oam_zte_vlan_mac_pack(&this->u.onu_port_mac_binding.clause[i5], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PORT_MAC_STATIC:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                uint8_t i6;
                if (this->u.onu_port_mac_static.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_port_mac_static.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_zte_onu_port_mac_operation_pack(this->u.onu_port_mac_static.op, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_port_mac_static.number_of_entries))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.onu_port_mac_static.number_of_entries > 0) && (this->u.onu_port_mac_static.clause == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"clause\" of struct \"bcmolt_epon_oam_ctc_ext_attribute_value_base_onu_port_mac_static\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i6 = 0; i6 < this->u.onu_port_mac_static.number_of_entries; i6++)
                {
                    if (!bcmolt_epon_oam_zte_vlan_mac_pack(&this->u.onu_port_mac_static.clause[i6], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PERFORMANCE_STAT:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.onu_performance_stat.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_performance_stat.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_performance_stat.ifinoctets))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_performance_stat.ifinucastpkts))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_performance_stat.ifinnucastpkts))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_performance_stat.ifindiscards))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_performance_stat.ifinerrors))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_performance_stat.ifoutoctets))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_performance_stat.ifoutucastpkts))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_performance_stat.ifoutnucastpkts))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_performance_stat.ifoutdiscards))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_performance_stat.ifouterrors))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_performance_stat.reserved1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_performance_stat.reserved2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_performance_stat.reserved3))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_performance_stat.reserved4))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PORT_ISOLATE:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_port_isolate.width))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_zte_isolate_mode_pack(this->u.onu_port_isolate.port_isolate, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_MAC_ADDRESS_TABLE_QUERY:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.onu_mac_address_table_query.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_mac_address_table_query.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PON_MAC_DOWNSTREAM_SHAPING:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.onu_pon_mac_downstream_shaping.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_pon_mac_downstream_shaping.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.onu_pon_mac_downstream_shaping.ponmacdsratelimitingenable))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u24(buf, this->u.onu_pon_mac_downstream_shaping.cir))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u24(buf, this->u.onu_pon_mac_downstream_shaping.cbs))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PON_MAC_USDSBUFFER_CAPABILITY_QUERY:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.onu_pon_mac_usdsbuffer_capability_query.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_pon_mac_usdsbuffer_capability_query.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_zte_buffer_manage_mode_pack(this->u.onu_pon_mac_usdsbuffer_capability_query.buffer_management_capability, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u24(buf, this->u.onu_pon_mac_usdsbuffer_capability_query.dsbuffer_size_minimum_value))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u24(buf, this->u.onu_pon_mac_usdsbuffer_capability_query.dsbuffer_size_maximum_value))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u24(buf, this->u.onu_pon_mac_usdsbuffer_capability_query.usbuffer_size_minimum_value))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u24(buf, this->u.onu_pon_mac_usdsbuffer_capability_query.usbuffer_size_maximum_value))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PON_MAC_USDSBUFFER:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.onu_pon_mac_usdsbuffer.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_pon_mac_usdsbuffer.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.onu_pon_mac_usdsbuffer.buffer_management_indication))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_zte_dsbuf_direction_pack(this->u.onu_pon_mac_usdsbuffer.direction, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u24(buf, this->u.onu_pon_mac_usdsbuffer.buffer_size))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PORT_STATISTICS_COLLECT_CONTROL:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.onu_port_statistics_collect_control.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_port_statistics_collect_control.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_zte_statistics_action_mode_pack(this->u.onu_port_statistics_collect_control.statistics_action, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u24(buf, this->u.onu_port_statistics_collect_control.statistics_interval))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.onu_port_statistics_collect_control.statistics_duration_time))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PORT_STATISTICS_COUNTER_RESET:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.onu_port_statistics_counter_reset.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_port_statistics_counter_reset.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_zte_statistics_reset_mode_pack(this->u.onu_port_statistics_counter_reset.statistics_reset, buf))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PORT_FLUX_STATISTICS_COUNTER:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.onu_port_flux_statistics_counter.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_port_flux_statistics_counter.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_uni_flow_statistics_collect_control_mode_pack(this->u.onu_port_flux_statistics_counter.uniflowstatisticscollectcontrolindication, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_port_flux_statistics_counter.ifinoctets))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_port_flux_statistics_counter.ifinucastpkts))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_port_flux_statistics_counter.ifinnucastpkts))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_port_flux_statistics_counter.ifindiscards))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_port_flux_statistics_counter.ifinerrors))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_port_flux_statistics_counter.ifoutoctets))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_port_flux_statistics_counter.ifoutucastpkts))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_port_flux_statistics_counter.ifoutnucastpkts))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_port_flux_statistics_counter.ifoutdiscards))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_port_flux_statistics_counter.ifouterrors))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_LIGHT_EXCEPTION:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.onu_light_exception.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_light_exception.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_light_exception.ponportnumber))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_light_indication_mode_pack(this->u.onu_light_exception.main_light_indication, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_light_indication_mode_pack(this->u.onu_light_exception.reserve_light_indication, buf))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_LIGHT_CONTROL:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.onu_light_control.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_light_control.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_match_mac_address_mode_pack(this->u.onu_light_control.match_mac_address, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_mac_address(buf, this->u.onu_light_control.pon_mac_address))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_zte_light_control_action_mode_pack(this->u.onu_light_control.action, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.onu_light_control.duration_time))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PON_PORT_STATISTICS_GET1:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.onu_pon_port_statistics_get1.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_pon_port_statistics_get1.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_pon_port_statistics_get1.frames_transmittedok))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_pon_port_statistics_get1.octets_transmittedok))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_pon_port_statistics_get1.multicast_framesxmitted_ok))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_pon_port_statistics_get1.broadcast_framesxmitted_ok))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_pon_port_statistics_get1.frames_received_ok))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_pon_port_statistics_get1.octets_received_ok))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_pon_port_statistics_get1.multicast_frames_received_ok))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_pon_port_statistics_get1.broadcast_frames_received_ok))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PON_PORT_STATISTICS_GET2:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.onu_pon_port_statistics_get2.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_pon_port_statistics_get2.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_pon_port_statistics_get2.crc8errors))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_pon_port_statistics_get2.fec_corrected_blocks))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_pon_port_statistics_get2.fec_uncorrectable_blocks))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_pon_port_statistics_get2.mpcp_mac_ctrl_frames_transmitted))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_pon_port_statistics_get2.mpcp_mac_ctrl_frames_received))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_pon_port_statistics_get2.mpcp_tx_register))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_pon_port_statistics_get2.mpcp_tx_regrequest))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_pon_port_statistics_get2.mpcp_tx_report))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_pon_port_statistics_get2.mpcp_rx_gate))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_pon_port_statistics_get2.mpcp_rx_registe))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ALARM_CONFIG:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.alarm_config.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.alarm_config.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_alarm_config_mode_pack(this->u.alarm_config.alarm_config, buf))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ROUGUE_ONU_EXCL_ABILITY:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.rougue_onu_excl_ability.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.rougue_onu_excl_ability.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_onu_excl_ability_pack(this->u.rougue_onu_excl_ability.ability, buf))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_POWER_SAVING_CAPABILITIES:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.onu_power_saving_capabilities.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_power_saving_capabilities.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_sleep_mode_pack(this->u.onu_power_saving_capabilities.sleep_mode_capability, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_early_wake_capability_pack(this->u.onu_power_saving_capabilities.early_wake_up_capability, buf))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_POWER_SAVING_CONFIG:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.onu_power_saving_config.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_power_saving_config.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_early_wake_up_mode_pack(this->u.onu_power_saving_config.early_wake_up, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.onu_power_saving_config.sleep_duration_max, 6))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PROTECTION_PARAMETERS:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.onu_protection_parameters.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_protection_parameters.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.onu_protection_parameters.optical_los_time))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.onu_protection_parameters.mac_los_time))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_PORT_DISABLE_ON_LOOP_DETECTED:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.port_disable_on_loop_detected.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.port_disable_on_loop_detected.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_port_disable_on_loop_detected_state_pack(this->u.port_disable_on_loop_detected.state, buf))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_MAC_AGING_TIME:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.mac_aging_time.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.mac_aging_time.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.mac_aging_time.aging_time))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_PERFORMANCE_MONITORING_STATUS:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.performance_monitoring_status.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.performance_monitoring_status.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_monitoring_status_pack(this->u.performance_monitoring_status.monitoring_status, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.performance_monitoring_status.monitoring_period))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_PERFORMANCE_MONITORING_CURRENT_DATA:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.performance_monitoring_current_data.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.performance_monitoring_current_data.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.performance_monitoring_current_data.stats_field1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.performance_monitoring_current_data.stats_field2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.performance_monitoring_current_data.stats_field3))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.performance_monitoring_current_data.stats_field4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.performance_monitoring_current_data.stats_field5))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.performance_monitoring_current_data.stats_field6))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.performance_monitoring_current_data.stats_field7))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.performance_monitoring_current_data.stats_field8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.performance_monitoring_current_data.stats_field9))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.performance_monitoring_current_data.stats_field10))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.performance_monitoring_current_data.stats_field11))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.performance_monitoring_current_data.stats_field12))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.performance_monitoring_current_data.stats_field13))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.performance_monitoring_current_data.stats_field14))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.performance_monitoring_current_data.stats_field15))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.performance_monitoring_current_data.stats_field16))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_PERFORMANCE_MONITORING_HISTORY_DATA:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.performance_monitoring_history_data.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.performance_monitoring_history_data.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.performance_monitoring_history_data.stats_field1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.performance_monitoring_history_data.stats_field2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.performance_monitoring_history_data.stats_field3))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.performance_monitoring_history_data.stats_field4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.performance_monitoring_history_data.stats_field5))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.performance_monitoring_history_data.stats_field6))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.performance_monitoring_history_data.stats_field7))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.performance_monitoring_history_data.stats_field8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.performance_monitoring_history_data.stats_field9))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.performance_monitoring_history_data.stats_field10))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.performance_monitoring_history_data.stats_field11))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.performance_monitoring_history_data.stats_field12))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.performance_monitoring_history_data.stats_field13))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.performance_monitoring_history_data.stats_field14))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.performance_monitoring_history_data.stats_field15))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.performance_monitoring_history_data.stats_field16))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_TX_POWER_SUPPLY_CONTROL:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.onu_tx_power_supply_control.action))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_mac_address(buf, this->u.onu_tx_power_supply_control.onu_id))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.onu_tx_power_supply_control.opt_id))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.def.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.def.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.def.unknown_count > 0) && (this->u.def.unknown == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"unknown\" of struct \"bcmolt_epon_oam_ctc_ext_attribute_value_base_def\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.def.unknown, this->u.def.unknown_count))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_ext_attribute_value_base_get_packed_length(bcmolt_epon_oam_ctc_ext_attribute_value_base *this)
{
    uint32_t count = 2;
    switch (this->leaf)
    {
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_PPPO_ETEST_RESULT:
            {
                count += 3;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_PPPO_ETEST_CONFIGURATION:
            {
                count += 101;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_END:
            {
                count += 1 + this->u.end.unknown_count;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_SERIAL_NUMBER:
            {
                count += 55;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_FIRMWARE_VERSION:
            {
                count += 1 + this->u.firmware_version.firmware_version_count;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_CHIPSET_ID:
            {
                count += 9;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_CAPABILITIES1:
            {
                count += 27;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_OPTICAL_TRANSCEIVER_DIAGNOSIS:
            {
                count += 11;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_SERVICE_SLA:
            {
                count += 1 + bcmolt_epon_oam_ctc_onu_service_sla_base_get_packed_length(&this->u.service_sla.service_sla);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_CAPABILITIES2:
            {
                count += 11 + (6 * this->u.onu_capabilities2.interfaces_count);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_HOLDOVER_CONFIG:
            {
                count += 9;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_MXU_MANAGE_GLOBAL_PARAMETER:
            {
                count += bcmolt_epon_oam_ctc_mxu_global_params_base_get_packed_length(&this->u.mxu_manage_global_parameter.params);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_MXU_MANAGE_SNMP_PARAMETER:
            {
                count += bcmolt_epon_oam_ctc_mxu_snmp_params_base_get_packed_length(&this->u.mxu_manage_snmp_parameter.params);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ACTIVE_PON_IFADMIN:
            {
                count += 2;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_CAPABILITIES3:
            {
                count += 4;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ETH_LINK_STATE:
            {
                count += 2;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ETH_PORT_PAUSE:
            {
                count += 2;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ETH_PORT_POLICING:
            {
                count += 1 + bcmolt_epon_oam_ctc_eth_port_policing_config_base_get_packed_length(&this->u.eth_port_policing.config);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_VOIP_PORT:
            {
                count += 2;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_E1PORT:
            {
                count += 2;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ETH_PORT_DOWN_RATE_LIMITING:
            {
                count += 8;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_PORT_LOOP_DETECT:
            {
                count += 5;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_VLAN:
            {
                count += 1 + bcmolt_epon_oam_ctc_vlan_prov_base_get_packed_length(&this->u.vlan.vlan_info);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_CLASSIFICATION_AND_MARKING:
            {
                uint32_t i0;
                count += 3;
                if ((this->u.classification_and_marking.rules_count > 0) && (this->u.classification_and_marking.rules == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"rules_count\" of struct \"bcmolt_epon_oam_ctc_ext_attribute_value_base\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return 0;
                }

                for (i0 = 0; i0 < this->u.classification_and_marking.rules_count; i0++)
                {
                    count += bcmolt_epon_oam_ctc_rule_get_packed_length(&this->u.classification_and_marking.rules[i0]);
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_MULTICAST_VLAN:
            {
                count += 1 + bcmolt_epon_oam_ctc_multicast_vlan_prov_get_packed_length(&this->u.multicast_vlan.vlan_info);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_MULTICAST_TAG_OPERATION:
            {
                count += 1 + bcmolt_epon_oam_ctc_multicast_tag_operation_base_get_packed_length(&this->u.multicast_tag_operation.tag_operation);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_MULTICAST_SWITCH:
            {
                count += 2;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_MULTICAST_CONTROL:
            {
                count += 1 + bcmolt_epon_oam_ctc_multicast_control_get_packed_length(&this->u.multicast_control.value);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_GROUP_MAX:
            {
                count += 2;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_FAST_LEAVE_ABILITY:
            {
                count += 5 + (4 * this->u.fast_leave_ability.fast_leave_modes_count);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_FAST_LEAVE_ADMIN_STATE:
            {
                count += 5;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_LLID_QUEUE_CONFIG:
            {
                count += 2 + (4 * this->u.llid_queue_config.llid_queue_table_count);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_IAD_INFORMATION:
            {
                count += 73;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_VOIP_GLOBAL_PARAMETERS:
            {
                count += 85;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_H248PARAMETERS:
            {
                count += 85;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_H248USER_TID_INFORMATION:
            {
                count += 33;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_H248RTP_TID_CONFIGURATION:
            {
                count += 28;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_H248RTP_TID_INFORMATION:
            {
                count += 34;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_SIP_PARAMETERS:
            {
                count += 46;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_SIP_USER_PARAMETERS:
            {
                count += 65;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_FAX_MODEM_CONFIGURATION:
            {
                count += 3;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_H248IAD_OPERATION_STATUS:
            {
                count += 5;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_POTS_STATUS:
            {
                count += 13;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_IAD_OPERATION:
            {
                count += 5;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_SIP_DIGIT_MAP:
            {
                count += 3 + this->u.sip_digit_map.sip_digital_map_count;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ALARM_ADMIN_STATE:
            {
                count += 7;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ALARM_THRESHOLD:
            {
                count += 11;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_VERSION_SERVER_PARA:
            {
                count += 81;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_MAC_LIMIT:
            {
                count += 3;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_MAC_AGING_TIME:
            {
                count += 5;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PORT_MAC_FILTER:
            {
                count += 3 + (8 * this->u.onu_port_mac_filter.number_of_entries);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PORT_MAC_BINDING:
            {
                count += 3 + (8 * this->u.onu_port_mac_binding.number_of_entries);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PORT_MAC_STATIC:
            {
                count += 3 + (8 * this->u.onu_port_mac_static.number_of_entries);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PERFORMANCE_STAT:
            {
                count += 113;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PORT_ISOLATE:
            {
                count += 2;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_MAC_ADDRESS_TABLE_QUERY:
            {
                count += 1;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PON_MAC_DOWNSTREAM_SHAPING:
            {
                count += 8;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PON_MAC_USDSBUFFER_CAPABILITY_QUERY:
            {
                count += 14;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PON_MAC_USDSBUFFER:
            {
                count += 6;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PORT_STATISTICS_COLLECT_CONTROL:
            {
                count += 9;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PORT_STATISTICS_COUNTER_RESET:
            {
                count += 2;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PORT_FLUX_STATISTICS_COUNTER:
            {
                count += 82;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_LIGHT_EXCEPTION:
            {
                count += 4;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_LIGHT_CONTROL:
            {
                count += 11;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PON_PORT_STATISTICS_GET1:
            {
                count += 65;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PON_PORT_STATISTICS_GET2:
            {
                count += 81;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ALARM_CONFIG:
            {
                count += 2;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ROUGUE_ONU_EXCL_ABILITY:
            {
                count += 2;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_POWER_SAVING_CAPABILITIES:
            {
                count += 3;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_POWER_SAVING_CONFIG:
            {
                count += 8;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PROTECTION_PARAMETERS:
            {
                count += 5;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_PORT_DISABLE_ON_LOOP_DETECTED:
            {
                count += 5;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_MAC_AGING_TIME:
            {
                count += 5;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_PERFORMANCE_MONITORING_STATUS:
            {
                count += 7;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_PERFORMANCE_MONITORING_CURRENT_DATA:
            {
                count += 129;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_PERFORMANCE_MONITORING_HISTORY_DATA:
            {
                count += 129;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_TX_POWER_SUPPLY_CONTROL:
            {
                count += 13;
            }
            break;
        default:
            {
                count += 1 + this->u.def.unknown_count;
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_ext_attribute_value_base_unpack(bcmolt_epon_oam_ctc_ext_attribute_value_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_ctc_leaf_ext_attribute_unpack(&this->leaf, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->leaf)
    {
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_PPPO_ETEST_RESULT:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.pppo_etest_result.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.pppo_etest_result.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.pppo_etest_result.width == 0) ? 0x0080 : this->u.pppo_etest_result.width, buf->curr);
                if (!bcmolt_epon_oam_pppo_etest_status_unpack(&this->u.pppo_etest_result.status, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_pppo_etest_fail_reason_unpack(&this->u.pppo_etest_result.reason, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.pppo_etest_result.width == 0) ? 0x0080 : this->u.pppo_etest_result.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_PPPO_ETEST_CONFIGURATION:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.pppo_etest_configuration.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.pppo_etest_configuration.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.pppo_etest_configuration.width == 0) ? 0x0080 : this->u.pppo_etest_configuration.width, buf->curr);
                if (!bcmolt_epon_oam_start_or_stop_indication_unpack(&this->u.pppo_etest_configuration.start_or_stop, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.pppo_etest_configuration.user_name, 64))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.pppo_etest_configuration.password, 32))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_pppo_eauth_mode_unpack(&this->u.pppo_etest_configuration.mode, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.pppo_etest_configuration.vlan))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.pppo_etest_configuration.width == 0) ? 0x0080 : this->u.pppo_etest_configuration.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_END:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.end.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.end.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.end.width == 0) ? 0x0080 : this->u.end.width, buf->curr);
                this->u.end.unknown_count = bcmolt_epon_oam_ctc_ext_attribute_value_base_end_count_unknown(&postLenBuf);
                if ((this->u.end.unknown_count > 0) && (this->u.end.unknown == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"unknown\" of struct \"bcmolt_epon_oam_ctc_ext_attribute_value_base_end\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.end.unknown = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.end.unknown_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.end.unknown, this->u.end.unknown_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.end.width == 0) ? 0x0080 : this->u.end.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_SERIAL_NUMBER:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.onu_serial_number.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.onu_serial_number.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.onu_serial_number.width == 0) ? 0x0080 : this->u.onu_serial_number.width, buf->curr);
                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.onu_serial_number.vendor_id, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.onu_serial_number.onu_model))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_mac_address(&postLenBuf, &this->u.onu_serial_number.onu_mac))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.onu_serial_number.hwversion, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.onu_serial_number.swversion, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.onu_serial_number.ext_onu_model, 16))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.onu_serial_number.width == 0) ? 0x0080 : this->u.onu_serial_number.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_FIRMWARE_VERSION:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.firmware_version.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.firmware_version.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.firmware_version.width == 0) ? 0x0080 : this->u.firmware_version.width, buf->curr);
                this->u.firmware_version.firmware_version_count = bcmolt_epon_oam_ctc_ext_attribute_value_base_firmware_version_count_firmware_version(&postLenBuf);
                if ((this->u.firmware_version.firmware_version_count > 0) && (this->u.firmware_version.firmware_version == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"firmware_version\" of struct \"bcmolt_epon_oam_ctc_ext_attribute_value_base_firmware_version\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.firmware_version.firmware_version = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.firmware_version.firmware_version_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.firmware_version.firmware_version, this->u.firmware_version.firmware_version_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.firmware_version.width == 0) ? 0x0080 : this->u.firmware_version.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_CHIPSET_ID:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.chipset_id.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.chipset_id.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.chipset_id.width == 0) ? 0x0080 : this->u.chipset_id.width, buf->curr);
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.chipset_id.vendor_id))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.chipset_id.chip_model))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.chipset_id.revision))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.chipset_id.design_date, 3))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.chipset_id.width == 0) ? 0x0080 : this->u.chipset_id.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_CAPABILITIES1:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.onu_capabilities1.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.onu_capabilities1.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.onu_capabilities1.width == 0) ? 0x0080 : this->u.onu_capabilities1.width, buf->curr);
                if (!bcmolt_epon_oam_ctc_supported_services_unpack(&this->u.onu_capabilities1.services, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.onu_capabilities1.num_geports))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_capabilities1.gebitmap))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.onu_capabilities1.num_feports))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_capabilities1.febitmap))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.onu_capabilities1.num_pots_ports))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.onu_capabilities1.num_e1ports))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.onu_capabilities1.num_upstream_queues))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.onu_capabilities1.max_queues_per_port_up))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.onu_capabilities1.num_downstream_queues))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.onu_capabilities1.max_queues_per_port_down))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.onu_capabilities1.battery_backup))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.onu_capabilities1.width == 0) ? 0x0080 : this->u.onu_capabilities1.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_OPTICAL_TRANSCEIVER_DIAGNOSIS:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.optical_transceiver_diagnosis.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.optical_transceiver_diagnosis.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.optical_transceiver_diagnosis.width == 0) ? 0x0080 : this->u.optical_transceiver_diagnosis.width, buf->curr);
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.optical_transceiver_diagnosis.transceiver_temperature))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.optical_transceiver_diagnosis.supply_vcc))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.optical_transceiver_diagnosis.tx_bias_cur))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.optical_transceiver_diagnosis.tx_power_out))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.optical_transceiver_diagnosis.rx_power_in))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.optical_transceiver_diagnosis.width == 0) ? 0x0080 : this->u.optical_transceiver_diagnosis.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_SERVICE_SLA:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.service_sla.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.service_sla.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.service_sla.width == 0) ? 0x0080 : this->u.service_sla.width, buf->curr);
                if (!bcmolt_epon_oam_ctc_onu_service_sla_base_unpack(&this->u.service_sla.service_sla, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.service_sla.width == 0) ? 0x0080 : this->u.service_sla.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_CAPABILITIES2:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t i0;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.onu_capabilities2.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.onu_capabilities2.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.onu_capabilities2.width == 0) ? 0x0080 : this->u.onu_capabilities2.width, buf->curr);
                if (!bcmolt_epon_oam_ctc_onu_type_unpack(&this->u.onu_capabilities2.onu_type, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.onu_capabilities2.num_links))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_protection_type_unpack(&this->u.onu_capabilities2.protection_type, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.onu_capabilities2.num_pon_ifs))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.onu_capabilities2.num_slots))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.onu_capabilities2.interfaces_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.onu_capabilities2.interfaces_count > 0) && (this->u.onu_capabilities2.interfaces == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"interfaces\" of struct \"bcmolt_epon_oam_ctc_ext_attribute_value_base_onu_capabilities2\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.onu_capabilities2.interfaces = (bcmolt_epon_oam_ctc_onu_interface *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.onu_capabilities2.interfaces_count * sizeof(bcmolt_epon_oam_ctc_onu_interface));
                    }
                }

                for (i0 = 0; i0 < this->u.onu_capabilities2.interfaces_count; i0++)
                {
                    if (!bcmolt_epon_oam_ctc_onu_interface_unpack(&this->u.onu_capabilities2.interfaces[i0], &postLenBuf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }

                if (!bcmolt_epon_oam_buf_read_bool(&postLenBuf, &this->u.onu_capabilities2.battery_backup))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.onu_capabilities2.width == 0) ? 0x0080 : this->u.onu_capabilities2.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_HOLDOVER_CONFIG:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.holdover_config.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.holdover_config.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.holdover_config.width == 0) ? 0x0080 : this->u.holdover_config.width, buf->curr);
                if (!bcmolt_epon_oam_ctc_enabled_state_unpack(&this->u.holdover_config.holdover_state, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.holdover_config.holdover_time))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.holdover_config.width == 0) ? 0x0080 : this->u.holdover_config.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_MXU_MANAGE_GLOBAL_PARAMETER:
            {
                if (!bcmolt_epon_oam_ctc_mxu_global_params_base_unpack(&this->u.mxu_manage_global_parameter.params, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_MXU_MANAGE_SNMP_PARAMETER:
            {
                if (!bcmolt_epon_oam_ctc_mxu_snmp_params_base_unpack(&this->u.mxu_manage_snmp_parameter.params, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ACTIVE_PON_IFADMIN:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.active_pon_ifadmin.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.active_pon_ifadmin.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.active_pon_ifadmin.width == 0) ? 0x0080 : this->u.active_pon_ifadmin.width, buf->curr);
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.active_pon_ifadmin.pon_number))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.active_pon_ifadmin.width == 0) ? 0x0080 : this->u.active_pon_ifadmin.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_CAPABILITIES3:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.onu_capabilities3.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.onu_capabilities3.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.onu_capabilities3.width == 0) ? 0x0080 : this->u.onu_capabilities3.width, buf->curr);
                if (!bcmolt_epon_oam_buf_read_bool(&postLenBuf, &this->u.onu_capabilities3.is_ipv6aware))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_power_supply_control_type_unpack(&this->u.onu_capabilities3.power_control_type, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.onu_capabilities3.service_sla))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.onu_capabilities3.width == 0) ? 0x0080 : this->u.onu_capabilities3.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ETH_LINK_STATE:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.eth_link_state.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.eth_link_state.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.eth_link_state.width == 0) ? 0x0080 : this->u.eth_link_state.width, buf->curr);
                if (!bcmolt_epon_oam_buf_read_bool(&postLenBuf, &this->u.eth_link_state.link_state))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.eth_link_state.width == 0) ? 0x0080 : this->u.eth_link_state.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ETH_PORT_PAUSE:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.eth_port_pause.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.eth_port_pause.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.eth_port_pause.width == 0) ? 0x0080 : this->u.eth_port_pause.width, buf->curr);
                if (!bcmolt_epon_oam_buf_read_bool(&postLenBuf, &this->u.eth_port_pause.enabled))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.eth_port_pause.width == 0) ? 0x0080 : this->u.eth_port_pause.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ETH_PORT_POLICING:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.eth_port_policing.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.eth_port_policing.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.eth_port_policing.width == 0) ? 0x0080 : this->u.eth_port_policing.width, buf->curr);
                if (!bcmolt_epon_oam_ctc_eth_port_policing_config_base_unpack(&this->u.eth_port_policing.config, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.eth_port_policing.width == 0) ? 0x0080 : this->u.eth_port_policing.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_VOIP_PORT:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.voip_port.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.voip_port.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.voip_port.width == 0) ? 0x0080 : this->u.voip_port.width, buf->curr);
                if (!bcmolt_epon_oam_buf_read_bool(&postLenBuf, &this->u.voip_port.port_state))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.voip_port.width == 0) ? 0x0080 : this->u.voip_port.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_E1PORT:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.e1port.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.e1port.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.e1port.width == 0) ? 0x0080 : this->u.e1port.width, buf->curr);
                if (!bcmolt_epon_oam_buf_read_bool(&postLenBuf, &this->u.e1port.port_state))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.e1port.width == 0) ? 0x0080 : this->u.e1port.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ETH_PORT_DOWN_RATE_LIMITING:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.eth_port_down_rate_limiting.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.eth_port_down_rate_limiting.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.eth_port_down_rate_limiting.width == 0) ? 0x0080 : this->u.eth_port_down_rate_limiting.width, buf->curr);
                if (!bcmolt_epon_oam_buf_read_bool(&postLenBuf, &this->u.eth_port_down_rate_limiting.rate_limiting_enabled))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u24(&postLenBuf, &this->u.eth_port_down_rate_limiting.cir))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_read_u24(&postLenBuf, &this->u.eth_port_down_rate_limiting.pir))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.eth_port_down_rate_limiting.width == 0) ? 0x0080 : this->u.eth_port_down_rate_limiting.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_PORT_LOOP_DETECT:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.port_loop_detect.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.port_loop_detect.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.port_loop_detect.width == 0) ? 0x0080 : this->u.port_loop_detect.width, buf->curr);
                if (!bcmolt_epon_oam_ctc_enabled_state_unpack(&this->u.port_loop_detect.state, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.port_loop_detect.width == 0) ? 0x0080 : this->u.port_loop_detect.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_VLAN:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.vlan.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.vlan.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.vlan.width == 0) ? 0x0080 : this->u.vlan.width, buf->curr);
                if (!bcmolt_epon_oam_ctc_vlan_prov_base_unpack(&this->u.vlan.vlan_info, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.vlan.width == 0) ? 0x0080 : this->u.vlan.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_CLASSIFICATION_AND_MARKING:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t i1;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.classification_and_marking.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.classification_and_marking.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.classification_and_marking.width == 0) ? 0x0080 : this->u.classification_and_marking.width, buf->curr);
                if (!bcmolt_epon_oam_ctc_classification_operation_unpack(&this->u.classification_and_marking.op, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.classification_and_marking.rules_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.classification_and_marking.rules_count > 0) && (this->u.classification_and_marking.rules == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"rules\" of struct \"bcmolt_epon_oam_ctc_ext_attribute_value_base_classification_and_marking\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.classification_and_marking.rules = (bcmolt_epon_oam_ctc_rule *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.classification_and_marking.rules_count * sizeof(bcmolt_epon_oam_ctc_rule));
                    }
                }

                for (i1 = 0; i1 < this->u.classification_and_marking.rules_count; i1++)
                {
                    if (!bcmolt_epon_oam_ctc_rule_unpack(&this->u.classification_and_marking.rules[i1], &postLenBuf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.classification_and_marking.width == 0) ? 0x0080 : this->u.classification_and_marking.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_MULTICAST_VLAN:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.multicast_vlan.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.multicast_vlan.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.multicast_vlan.width == 0) ? 0x0080 : this->u.multicast_vlan.width, buf->curr);
                if (!bcmolt_epon_oam_ctc_multicast_vlan_prov_unpack(&this->u.multicast_vlan.vlan_info, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.multicast_vlan.width == 0) ? 0x0080 : this->u.multicast_vlan.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_MULTICAST_TAG_OPERATION:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.multicast_tag_operation.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.multicast_tag_operation.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.multicast_tag_operation.width == 0) ? 0x0080 : this->u.multicast_tag_operation.width, buf->curr);
                if (!bcmolt_epon_oam_ctc_multicast_tag_operation_base_unpack(&this->u.multicast_tag_operation.tag_operation, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.multicast_tag_operation.width == 0) ? 0x0080 : this->u.multicast_tag_operation.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_MULTICAST_SWITCH:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.multicast_switch.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.multicast_switch.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.multicast_switch.width == 0) ? 0x0080 : this->u.multicast_switch.width, buf->curr);
                if (!bcmolt_epon_oam_ctc_multicast_switch_mode_unpack(&this->u.multicast_switch.mode, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.multicast_switch.width == 0) ? 0x0080 : this->u.multicast_switch.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_MULTICAST_CONTROL:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.multicast_control.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.multicast_control.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.multicast_control.width == 0) ? 0x0080 : this->u.multicast_control.width, buf->curr);
                if (!bcmolt_epon_oam_ctc_multicast_control_unpack(&this->u.multicast_control.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.multicast_control.width == 0) ? 0x0080 : this->u.multicast_control.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_GROUP_MAX:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.group_max.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.group_max.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.group_max.width == 0) ? 0x0080 : this->u.group_max.width, buf->curr);
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.group_max.max_groups))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.group_max.width == 0) ? 0x0080 : this->u.group_max.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_FAST_LEAVE_ABILITY:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint32_t i2;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.fast_leave_ability.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.fast_leave_ability.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.fast_leave_ability.width == 0) ? 0x0080 : this->u.fast_leave_ability.width, buf->curr);
                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.fast_leave_ability.fast_leave_modes_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.fast_leave_ability.fast_leave_modes_count > 0) && (this->u.fast_leave_ability.fast_leave_modes == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"fast_leave_modes\" of struct \"bcmolt_epon_oam_ctc_ext_attribute_value_base_fast_leave_ability\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.fast_leave_ability.fast_leave_modes = (uint32_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.fast_leave_ability.fast_leave_modes_count * sizeof(uint32_t));
                    }
                }

                for (i2 = 0; i2 < this->u.fast_leave_ability.fast_leave_modes_count; i2++)
                {
                    if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.fast_leave_ability.fast_leave_modes[i2]))
                    {
                        return BCMOS_FALSE;
                    }
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.fast_leave_ability.width == 0) ? 0x0080 : this->u.fast_leave_ability.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_FAST_LEAVE_ADMIN_STATE:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.fast_leave_admin_state.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.fast_leave_admin_state.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.fast_leave_admin_state.width == 0) ? 0x0080 : this->u.fast_leave_admin_state.width, buf->curr);
                if (!bcmolt_epon_oam_ctc_enabled_state_unpack(&this->u.fast_leave_admin_state.state, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.fast_leave_admin_state.width == 0) ? 0x0080 : this->u.fast_leave_admin_state.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_LLID_QUEUE_CONFIG:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t i3;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.llid_queue_config.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.llid_queue_config.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.llid_queue_config.width == 0) ? 0x0080 : this->u.llid_queue_config.width, buf->curr);
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.llid_queue_config.llid_queue_table_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.llid_queue_config.llid_queue_table_count > 0) && (this->u.llid_queue_config.llid_queue_table == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"llid_queue_table\" of struct \"bcmolt_epon_oam_ctc_ext_attribute_value_base_llid_queue_config\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.llid_queue_config.llid_queue_table = (bcmolt_epon_oam_ctc_onu_llid_queue *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.llid_queue_config.llid_queue_table_count * sizeof(bcmolt_epon_oam_ctc_onu_llid_queue));
                    }
                }

                for (i3 = 0; i3 < this->u.llid_queue_config.llid_queue_table_count; i3++)
                {
                    if (!bcmolt_epon_oam_ctc_onu_llid_queue_unpack(&this->u.llid_queue_config.llid_queue_table[i3], &postLenBuf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.llid_queue_config.width == 0) ? 0x0080 : this->u.llid_queue_config.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_IAD_INFORMATION:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.iad_information.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.iad_information.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.iad_information.width == 0) ? 0x0080 : this->u.iad_information.width, buf->curr);
                if (!bcmolt_epon_oam_buf_read_mac_address(&postLenBuf, &this->u.iad_information.iad_mac))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_voip_protocol_unpack(&this->u.iad_information.protocol_support, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.iad_information.iad_software_ver, 32))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.iad_information.iad_software_time, 32))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.iad_information.voip_user_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.iad_information.width == 0) ? 0x0080 : this->u.iad_information.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_VOIP_GLOBAL_PARAMETERS:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.voip_global_parameters.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.voip_global_parameters.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.voip_global_parameters.width == 0) ? 0x0080 : this->u.voip_global_parameters.width, buf->curr);
                if (!bcmolt_epon_oam_ctc_voice_ipmode_unpack(&this->u.voip_global_parameters.voice_ipmode, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_ipv4_address(&postLenBuf, &this->u.voip_global_parameters.iad_ipaddr))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_ipv4_address(&postLenBuf, &this->u.voip_global_parameters.iad_net_mask))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_ipv4_address(&postLenBuf, &this->u.voip_global_parameters.iad_default_gw))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_pppoe_mode_unpack(&this->u.voip_global_parameters.pppoe_mode, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.voip_global_parameters.pppoe_username, 32))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.voip_global_parameters.pppoe_password, 32))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_voice_tagging_mode_unpack(&this->u.voip_global_parameters.tagging_mode, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.voip_global_parameters.voice_cvlan))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.voip_global_parameters.voice_svlan))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.voip_global_parameters.voice_pri))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.voip_global_parameters.width == 0) ? 0x0080 : this->u.voip_global_parameters.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_H248PARAMETERS:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.h248parameters.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.h248parameters.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.h248parameters.width == 0) ? 0x0080 : this->u.h248parameters.width, buf->curr);
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.h248parameters.mgport_number))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_ipv4_address(&postLenBuf, &this->u.h248parameters.mgc_ip))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.h248parameters.mgc_com_port))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_ipv4_address(&postLenBuf, &this->u.h248parameters.backup_mgc_ip))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.h248parameters.backup_mgc_com_port))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_bool(&postLenBuf, &this->u.h248parameters.use_active_mgc))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_h248reg_mode_unpack(&this->u.h248parameters.reg_mode, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.h248parameters.mid, 64))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_h248heartbeat_mode_unpack(&this->u.h248parameters.heartbeat_mode, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.h248parameters.heartbeat_cycle))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.h248parameters.heartbeat_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.h248parameters.width == 0) ? 0x0080 : this->u.h248parameters.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_H248USER_TID_INFORMATION:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.h248user_tid_information.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.h248user_tid_information.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.h248user_tid_information.width == 0) ? 0x0080 : this->u.h248user_tid_information.width, buf->curr);
                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.h248user_tid_information.name, 32))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.h248user_tid_information.width == 0) ? 0x0080 : this->u.h248user_tid_information.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_H248RTP_TID_CONFIGURATION:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.h248rtp_tid_configuration.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.h248rtp_tid_configuration.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.h248rtp_tid_configuration.width == 0) ? 0x0080 : this->u.h248rtp_tid_configuration.width, buf->curr);
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.h248rtp_tid_configuration.num_rtp_tids))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.h248rtp_tid_configuration.prefix, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.h248rtp_tid_configuration.digit_begin))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_rtp_tid_mode_unpack(&this->u.h248rtp_tid_configuration.rtp_tid_mode, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.h248rtp_tid_configuration.rtp_tid_length))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.h248rtp_tid_configuration.width == 0) ? 0x0080 : this->u.h248rtp_tid_configuration.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_H248RTP_TID_INFORMATION:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.h248rtp_tid_information.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.h248rtp_tid_information.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.h248rtp_tid_information.width == 0) ? 0x0080 : this->u.h248rtp_tid_information.width, buf->curr);
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.h248rtp_tid_information.num_rtp_tids))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.h248rtp_tid_information.first_rtp_tid_name, 32))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.h248rtp_tid_information.width == 0) ? 0x0080 : this->u.h248rtp_tid_information.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_SIP_PARAMETERS:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.sip_parameters.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.sip_parameters.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.sip_parameters.width == 0) ? 0x0080 : this->u.sip_parameters.width, buf->curr);
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.sip_parameters.mgport_number))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_ipv4_address(&postLenBuf, &this->u.sip_parameters.active_sip_ip))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.sip_parameters.active_sip_com_port))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_ipv4_address(&postLenBuf, &this->u.sip_parameters.backup_sip_ip))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.sip_parameters.backup_sip_com_port))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_ipv4_address(&postLenBuf, &this->u.sip_parameters.active_sip_proxy_server))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_ipv4_address(&postLenBuf, &this->u.sip_parameters.active_sip_registration_server_ip))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.sip_parameters.active_sip_registration_server_com_port))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_ipv4_address(&postLenBuf, &this->u.sip_parameters.backup_sip_reg_ip))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.sip_parameters.backup_sip_reg_com_port))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_ipv4_address(&postLenBuf, &this->u.sip_parameters.outbound_server_ip))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.sip_parameters.outbound_server_port))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.sip_parameters.sip_registration_interval))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_bool(&postLenBuf, &this->u.sip_parameters.disable_heartbeat_switch))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.sip_parameters.heartbeat_cycle))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.sip_parameters.heartbeat_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.sip_parameters.width == 0) ? 0x0080 : this->u.sip_parameters.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_SIP_USER_PARAMETERS:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.sip_user_parameters.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.sip_user_parameters.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.sip_user_parameters.width == 0) ? 0x0080 : this->u.sip_user_parameters.width, buf->curr);
                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.sip_user_parameters.account, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.sip_user_parameters.name, 32))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.sip_user_parameters.password, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.sip_user_parameters.width == 0) ? 0x0080 : this->u.sip_user_parameters.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_FAX_MODEM_CONFIGURATION:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.fax_modem_configuration.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.fax_modem_configuration.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.fax_modem_configuration.width == 0) ? 0x0080 : this->u.fax_modem_configuration.width, buf->curr);
                if (!bcmolt_epon_oam_ctc_voice_t38mode_unpack(&this->u.fax_modem_configuration.voice_t38enable, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_voice_fax_modem_control_mode_unpack(&this->u.fax_modem_configuration.voice_fax_modem_control, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.fax_modem_configuration.width == 0) ? 0x0080 : this->u.fax_modem_configuration.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_H248IAD_OPERATION_STATUS:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.h248iad_operation_status.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.h248iad_operation_status.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.h248iad_operation_status.width == 0) ? 0x0080 : this->u.h248iad_operation_status.width, buf->curr);
                if (!bcmolt_epon_oam_ctc_iad_operation_status_unpack(&this->u.h248iad_operation_status.iad_operation_status, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.h248iad_operation_status.width == 0) ? 0x0080 : this->u.h248iad_operation_status.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_POTS_STATUS:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.pots_status.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.pots_status.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.pots_status.width == 0) ? 0x0080 : this->u.pots_status.width, buf->curr);
                if (!bcmolt_epon_oam_ctc_iad_port_status_unpack(&this->u.pots_status.iad_port_status, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_iad_port_service_state_unpack(&this->u.pots_status.iad_port_service_state, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_iad_port_codec_mode_unpack(&this->u.pots_status.iad_port_codec_mode, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.pots_status.width == 0) ? 0x0080 : this->u.pots_status.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_IAD_OPERATION:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.iad_operation.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.iad_operation.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.iad_operation.width == 0) ? 0x0080 : this->u.iad_operation.width, buf->curr);
                if (!bcmolt_epon_oam_ctc_iad_operation_unpack(&this->u.iad_operation.iad_operation, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.iad_operation.width == 0) ? 0x0080 : this->u.iad_operation.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_SIP_DIGIT_MAP:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.sip_digit_map.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.sip_digit_map.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.sip_digit_map.width == 0) ? 0x0080 : this->u.sip_digit_map.width, buf->curr);
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.sip_digit_map.sip_digital_map_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.sip_digit_map.sip_digital_map_count > 0) && (this->u.sip_digit_map.sip_digital_map == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"sip_digital_map\" of struct \"bcmolt_epon_oam_ctc_ext_attribute_value_base_sip_digit_map\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.sip_digit_map.sip_digital_map = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.sip_digit_map.sip_digital_map_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.sip_digit_map.sip_digital_map, this->u.sip_digit_map.sip_digital_map_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.sip_digit_map.width == 0) ? 0x0080 : this->u.sip_digit_map.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ALARM_ADMIN_STATE:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.alarm_admin_state.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.alarm_admin_state.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.alarm_admin_state.width == 0) ? 0x0080 : this->u.alarm_admin_state.width, buf->curr);
                if (!bcmolt_epon_oam_ctc_onu_alarm_id_unpack(&this->u.alarm_admin_state.id, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_enabled_state_unpack(&this->u.alarm_admin_state.config, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.alarm_admin_state.width == 0) ? 0x0080 : this->u.alarm_admin_state.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ALARM_THRESHOLD:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.alarm_threshold.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.alarm_threshold.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.alarm_threshold.width == 0) ? 0x0080 : this->u.alarm_threshold.width, buf->curr);
                if (!bcmolt_epon_oam_ctc_onu_alarm_id_unpack(&this->u.alarm_threshold.id, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.alarm_threshold.threshold))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.alarm_threshold.clearing_threshold))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.alarm_threshold.width == 0) ? 0x0080 : this->u.alarm_threshold.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_VERSION_SERVER_PARA:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.version_server_para.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.version_server_para.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.version_server_para.width == 0) ? 0x0080 : this->u.version_server_para.width, buf->curr);
                if (!bcmolt_epon_oam_buf_read_ipv4_address(&postLenBuf, &this->u.version_server_para.ipaddress))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_ipv4_address(&postLenBuf, &this->u.version_server_para.ipmask))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_ipv4_address(&postLenBuf, &this->u.version_server_para.gateway))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_vlan_tag(&postLenBuf, &this->u.version_server_para.vlan_id))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.version_server_para.user_name, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.version_server_para.password, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.version_server_para.action))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.version_server_para.version_number))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.version_server_para.ver1name, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.version_server_para.ver2name, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.version_server_para.ver3name, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.version_server_para.width == 0) ? 0x0080 : this->u.version_server_para.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_MAC_LIMIT:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.onu_mac_limit.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.onu_mac_limit.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.onu_mac_limit.width == 0) ? 0x0080 : this->u.onu_mac_limit.width, buf->curr);
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.onu_mac_limit.mac_limit_number))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.onu_mac_limit.width == 0) ? 0x0080 : this->u.onu_mac_limit.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_MAC_AGING_TIME:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.onu_mac_aging_time.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.onu_mac_aging_time.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.onu_mac_aging_time.width == 0) ? 0x0080 : this->u.onu_mac_aging_time.width, buf->curr);
                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.onu_mac_aging_time.mac_aging_time))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.onu_mac_aging_time.width == 0) ? 0x0080 : this->u.onu_mac_aging_time.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PORT_MAC_FILTER:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t i4;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.onu_port_mac_filter.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.onu_port_mac_filter.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.onu_port_mac_filter.width == 0) ? 0x0080 : this->u.onu_port_mac_filter.width, buf->curr);
                if (!bcmolt_epon_oam_zte_onu_port_mac_operation_unpack(&this->u.onu_port_mac_filter.op, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.onu_port_mac_filter.number_of_entries))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.onu_port_mac_filter.number_of_entries > 0) && (this->u.onu_port_mac_filter.clause == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"clause\" of struct \"bcmolt_epon_oam_ctc_ext_attribute_value_base_onu_port_mac_filter\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.onu_port_mac_filter.clause = (bcmolt_epon_oam_zte_vlan_mac *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.onu_port_mac_filter.number_of_entries * sizeof(bcmolt_epon_oam_zte_vlan_mac));
                    }
                }

                for (i4 = 0; i4 < this->u.onu_port_mac_filter.number_of_entries; i4++)
                {
                    if (!bcmolt_epon_oam_zte_vlan_mac_unpack(&this->u.onu_port_mac_filter.clause[i4], &postLenBuf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.onu_port_mac_filter.width == 0) ? 0x0080 : this->u.onu_port_mac_filter.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PORT_MAC_BINDING:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t i5;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.onu_port_mac_binding.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.onu_port_mac_binding.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.onu_port_mac_binding.width == 0) ? 0x0080 : this->u.onu_port_mac_binding.width, buf->curr);
                if (!bcmolt_epon_oam_zte_onu_port_mac_operation_unpack(&this->u.onu_port_mac_binding.op, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.onu_port_mac_binding.number_of_entries))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.onu_port_mac_binding.number_of_entries > 0) && (this->u.onu_port_mac_binding.clause == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"clause\" of struct \"bcmolt_epon_oam_ctc_ext_attribute_value_base_onu_port_mac_binding\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.onu_port_mac_binding.clause = (bcmolt_epon_oam_zte_vlan_mac *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.onu_port_mac_binding.number_of_entries * sizeof(bcmolt_epon_oam_zte_vlan_mac));
                    }
                }

                for (i5 = 0; i5 < this->u.onu_port_mac_binding.number_of_entries; i5++)
                {
                    if (!bcmolt_epon_oam_zte_vlan_mac_unpack(&this->u.onu_port_mac_binding.clause[i5], &postLenBuf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.onu_port_mac_binding.width == 0) ? 0x0080 : this->u.onu_port_mac_binding.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PORT_MAC_STATIC:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t i6;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.onu_port_mac_static.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.onu_port_mac_static.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.onu_port_mac_static.width == 0) ? 0x0080 : this->u.onu_port_mac_static.width, buf->curr);
                if (!bcmolt_epon_oam_zte_onu_port_mac_operation_unpack(&this->u.onu_port_mac_static.op, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.onu_port_mac_static.number_of_entries))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.onu_port_mac_static.number_of_entries > 0) && (this->u.onu_port_mac_static.clause == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"clause\" of struct \"bcmolt_epon_oam_ctc_ext_attribute_value_base_onu_port_mac_static\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.onu_port_mac_static.clause = (bcmolt_epon_oam_zte_vlan_mac *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.onu_port_mac_static.number_of_entries * sizeof(bcmolt_epon_oam_zte_vlan_mac));
                    }
                }

                for (i6 = 0; i6 < this->u.onu_port_mac_static.number_of_entries; i6++)
                {
                    if (!bcmolt_epon_oam_zte_vlan_mac_unpack(&this->u.onu_port_mac_static.clause[i6], &postLenBuf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.onu_port_mac_static.width == 0) ? 0x0080 : this->u.onu_port_mac_static.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PERFORMANCE_STAT:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.onu_performance_stat.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.onu_performance_stat.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.onu_performance_stat.width == 0) ? 0x0080 : this->u.onu_performance_stat.width, buf->curr);
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_performance_stat.ifinoctets))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_performance_stat.ifinucastpkts))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_performance_stat.ifinnucastpkts))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_performance_stat.ifindiscards))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_performance_stat.ifinerrors))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_performance_stat.ifoutoctets))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_performance_stat.ifoutucastpkts))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_performance_stat.ifoutnucastpkts))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_performance_stat.ifoutdiscards))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_performance_stat.ifouterrors))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_performance_stat.reserved1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_performance_stat.reserved2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_performance_stat.reserved3))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_performance_stat.reserved4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.onu_performance_stat.width == 0) ? 0x0080 : this->u.onu_performance_stat.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PORT_ISOLATE:
            {
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.onu_port_isolate.width))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_zte_isolate_mode_unpack(&this->u.onu_port_isolate.port_isolate, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_MAC_ADDRESS_TABLE_QUERY:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.onu_mac_address_table_query.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.onu_mac_address_table_query.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.onu_mac_address_table_query.width == 0) ? 0x0080 : this->u.onu_mac_address_table_query.width, buf->curr);
                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.onu_mac_address_table_query.width == 0) ? 0x0080 : this->u.onu_mac_address_table_query.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PON_MAC_DOWNSTREAM_SHAPING:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.onu_pon_mac_downstream_shaping.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.onu_pon_mac_downstream_shaping.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.onu_pon_mac_downstream_shaping.width == 0) ? 0x0080 : this->u.onu_pon_mac_downstream_shaping.width, buf->curr);
                if (!bcmolt_epon_oam_buf_read_bool(&postLenBuf, &this->u.onu_pon_mac_downstream_shaping.ponmacdsratelimitingenable))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u24(&postLenBuf, &this->u.onu_pon_mac_downstream_shaping.cir))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_read_u24(&postLenBuf, &this->u.onu_pon_mac_downstream_shaping.cbs))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.onu_pon_mac_downstream_shaping.width == 0) ? 0x0080 : this->u.onu_pon_mac_downstream_shaping.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PON_MAC_USDSBUFFER_CAPABILITY_QUERY:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.onu_pon_mac_usdsbuffer_capability_query.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.onu_pon_mac_usdsbuffer_capability_query.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.onu_pon_mac_usdsbuffer_capability_query.width == 0) ? 0x0080 : this->u.onu_pon_mac_usdsbuffer_capability_query.width, buf->curr);
                if (!bcmolt_epon_oam_zte_buffer_manage_mode_unpack(&this->u.onu_pon_mac_usdsbuffer_capability_query.buffer_management_capability, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u24(&postLenBuf, &this->u.onu_pon_mac_usdsbuffer_capability_query.dsbuffer_size_minimum_value))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u24(&postLenBuf, &this->u.onu_pon_mac_usdsbuffer_capability_query.dsbuffer_size_maximum_value))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u24(&postLenBuf, &this->u.onu_pon_mac_usdsbuffer_capability_query.usbuffer_size_minimum_value))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u24(&postLenBuf, &this->u.onu_pon_mac_usdsbuffer_capability_query.usbuffer_size_maximum_value))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.onu_pon_mac_usdsbuffer_capability_query.width == 0) ? 0x0080 : this->u.onu_pon_mac_usdsbuffer_capability_query.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PON_MAC_USDSBUFFER:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.onu_pon_mac_usdsbuffer.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.onu_pon_mac_usdsbuffer.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.onu_pon_mac_usdsbuffer.width == 0) ? 0x0080 : this->u.onu_pon_mac_usdsbuffer.width, buf->curr);
                if (!bcmolt_epon_oam_buf_read_bool(&postLenBuf, &this->u.onu_pon_mac_usdsbuffer.buffer_management_indication))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_zte_dsbuf_direction_unpack(&this->u.onu_pon_mac_usdsbuffer.direction, &postLenBuf))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_read_u24(&postLenBuf, &this->u.onu_pon_mac_usdsbuffer.buffer_size))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.onu_pon_mac_usdsbuffer.width == 0) ? 0x0080 : this->u.onu_pon_mac_usdsbuffer.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PORT_STATISTICS_COLLECT_CONTROL:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.onu_port_statistics_collect_control.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.onu_port_statistics_collect_control.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.onu_port_statistics_collect_control.width == 0) ? 0x0080 : this->u.onu_port_statistics_collect_control.width, buf->curr);
                if (!bcmolt_epon_oam_zte_statistics_action_mode_unpack(&this->u.onu_port_statistics_collect_control.statistics_action, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u24(&postLenBuf, &this->u.onu_port_statistics_collect_control.statistics_interval))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.onu_port_statistics_collect_control.statistics_duration_time))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.onu_port_statistics_collect_control.width == 0) ? 0x0080 : this->u.onu_port_statistics_collect_control.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PORT_STATISTICS_COUNTER_RESET:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.onu_port_statistics_counter_reset.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.onu_port_statistics_counter_reset.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.onu_port_statistics_counter_reset.width == 0) ? 0x0080 : this->u.onu_port_statistics_counter_reset.width, buf->curr);
                if (!bcmolt_epon_oam_zte_statistics_reset_mode_unpack(&this->u.onu_port_statistics_counter_reset.statistics_reset, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.onu_port_statistics_counter_reset.width == 0) ? 0x0080 : this->u.onu_port_statistics_counter_reset.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PORT_FLUX_STATISTICS_COUNTER:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.onu_port_flux_statistics_counter.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.onu_port_flux_statistics_counter.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.onu_port_flux_statistics_counter.width == 0) ? 0x0080 : this->u.onu_port_flux_statistics_counter.width, buf->curr);
                if (!bcmolt_epon_oam_uni_flow_statistics_collect_control_mode_unpack(&this->u.onu_port_flux_statistics_counter.uniflowstatisticscollectcontrolindication, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_port_flux_statistics_counter.ifinoctets))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_port_flux_statistics_counter.ifinucastpkts))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_port_flux_statistics_counter.ifinnucastpkts))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_port_flux_statistics_counter.ifindiscards))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_port_flux_statistics_counter.ifinerrors))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_port_flux_statistics_counter.ifoutoctets))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_port_flux_statistics_counter.ifoutucastpkts))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_port_flux_statistics_counter.ifoutnucastpkts))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_port_flux_statistics_counter.ifoutdiscards))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_port_flux_statistics_counter.ifouterrors))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.onu_port_flux_statistics_counter.width == 0) ? 0x0080 : this->u.onu_port_flux_statistics_counter.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_LIGHT_EXCEPTION:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.onu_light_exception.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.onu_light_exception.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.onu_light_exception.width == 0) ? 0x0080 : this->u.onu_light_exception.width, buf->curr);
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.onu_light_exception.ponportnumber))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_light_indication_mode_unpack(&this->u.onu_light_exception.main_light_indication, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_light_indication_mode_unpack(&this->u.onu_light_exception.reserve_light_indication, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.onu_light_exception.width == 0) ? 0x0080 : this->u.onu_light_exception.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_LIGHT_CONTROL:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.onu_light_control.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.onu_light_control.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.onu_light_control.width == 0) ? 0x0080 : this->u.onu_light_control.width, buf->curr);
                if (!bcmolt_epon_oam_match_mac_address_mode_unpack(&this->u.onu_light_control.match_mac_address, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_mac_address(&postLenBuf, &this->u.onu_light_control.pon_mac_address))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_zte_light_control_action_mode_unpack(&this->u.onu_light_control.action, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.onu_light_control.duration_time))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.onu_light_control.width == 0) ? 0x0080 : this->u.onu_light_control.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PON_PORT_STATISTICS_GET1:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.onu_pon_port_statistics_get1.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.onu_pon_port_statistics_get1.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.onu_pon_port_statistics_get1.width == 0) ? 0x0080 : this->u.onu_pon_port_statistics_get1.width, buf->curr);
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_pon_port_statistics_get1.frames_transmittedok))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_pon_port_statistics_get1.octets_transmittedok))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_pon_port_statistics_get1.multicast_framesxmitted_ok))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_pon_port_statistics_get1.broadcast_framesxmitted_ok))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_pon_port_statistics_get1.frames_received_ok))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_pon_port_statistics_get1.octets_received_ok))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_pon_port_statistics_get1.multicast_frames_received_ok))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_pon_port_statistics_get1.broadcast_frames_received_ok))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.onu_pon_port_statistics_get1.width == 0) ? 0x0080 : this->u.onu_pon_port_statistics_get1.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PON_PORT_STATISTICS_GET2:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.onu_pon_port_statistics_get2.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.onu_pon_port_statistics_get2.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.onu_pon_port_statistics_get2.width == 0) ? 0x0080 : this->u.onu_pon_port_statistics_get2.width, buf->curr);
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_pon_port_statistics_get2.crc8errors))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_pon_port_statistics_get2.fec_corrected_blocks))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_pon_port_statistics_get2.fec_uncorrectable_blocks))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_pon_port_statistics_get2.mpcp_mac_ctrl_frames_transmitted))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_pon_port_statistics_get2.mpcp_mac_ctrl_frames_received))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_pon_port_statistics_get2.mpcp_tx_register))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_pon_port_statistics_get2.mpcp_tx_regrequest))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_pon_port_statistics_get2.mpcp_tx_report))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_pon_port_statistics_get2.mpcp_rx_gate))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_pon_port_statistics_get2.mpcp_rx_registe))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.onu_pon_port_statistics_get2.width == 0) ? 0x0080 : this->u.onu_pon_port_statistics_get2.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ALARM_CONFIG:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.alarm_config.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.alarm_config.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.alarm_config.width == 0) ? 0x0080 : this->u.alarm_config.width, buf->curr);
                if (!bcmolt_epon_oam_alarm_config_mode_unpack(&this->u.alarm_config.alarm_config, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.alarm_config.width == 0) ? 0x0080 : this->u.alarm_config.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ROUGUE_ONU_EXCL_ABILITY:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.rougue_onu_excl_ability.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.rougue_onu_excl_ability.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.rougue_onu_excl_ability.width == 0) ? 0x0080 : this->u.rougue_onu_excl_ability.width, buf->curr);
                if (!bcmolt_epon_oam_onu_excl_ability_unpack(&this->u.rougue_onu_excl_ability.ability, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.rougue_onu_excl_ability.width == 0) ? 0x0080 : this->u.rougue_onu_excl_ability.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_POWER_SAVING_CAPABILITIES:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.onu_power_saving_capabilities.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.onu_power_saving_capabilities.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.onu_power_saving_capabilities.width == 0) ? 0x0080 : this->u.onu_power_saving_capabilities.width, buf->curr);
                if (!bcmolt_epon_oam_ctc_onu_sleep_mode_unpack(&this->u.onu_power_saving_capabilities.sleep_mode_capability, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_onu_early_wake_capability_unpack(&this->u.onu_power_saving_capabilities.early_wake_up_capability, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.onu_power_saving_capabilities.width == 0) ? 0x0080 : this->u.onu_power_saving_capabilities.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_POWER_SAVING_CONFIG:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.onu_power_saving_config.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.onu_power_saving_config.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.onu_power_saving_config.width == 0) ? 0x0080 : this->u.onu_power_saving_config.width, buf->curr);
                if (!bcmolt_epon_oam_ctc_early_wake_up_mode_unpack(&this->u.onu_power_saving_config.early_wake_up, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.onu_power_saving_config.sleep_duration_max, 6))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.onu_power_saving_config.width == 0) ? 0x0080 : this->u.onu_power_saving_config.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PROTECTION_PARAMETERS:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.onu_protection_parameters.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.onu_protection_parameters.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.onu_protection_parameters.width == 0) ? 0x0080 : this->u.onu_protection_parameters.width, buf->curr);
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.onu_protection_parameters.optical_los_time))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.onu_protection_parameters.mac_los_time))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.onu_protection_parameters.width == 0) ? 0x0080 : this->u.onu_protection_parameters.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_PORT_DISABLE_ON_LOOP_DETECTED:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.port_disable_on_loop_detected.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.port_disable_on_loop_detected.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.port_disable_on_loop_detected.width == 0) ? 0x0080 : this->u.port_disable_on_loop_detected.width, buf->curr);
                if (!bcmolt_epon_oam_ctc_port_disable_on_loop_detected_state_unpack(&this->u.port_disable_on_loop_detected.state, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.port_disable_on_loop_detected.width == 0) ? 0x0080 : this->u.port_disable_on_loop_detected.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_MAC_AGING_TIME:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.mac_aging_time.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.mac_aging_time.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.mac_aging_time.width == 0) ? 0x0080 : this->u.mac_aging_time.width, buf->curr);
                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.mac_aging_time.aging_time))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.mac_aging_time.width == 0) ? 0x0080 : this->u.mac_aging_time.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_PERFORMANCE_MONITORING_STATUS:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.performance_monitoring_status.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.performance_monitoring_status.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.performance_monitoring_status.width == 0) ? 0x0080 : this->u.performance_monitoring_status.width, buf->curr);
                if (!bcmolt_epon_oam_ctc_monitoring_status_unpack(&this->u.performance_monitoring_status.monitoring_status, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.performance_monitoring_status.monitoring_period))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.performance_monitoring_status.width == 0) ? 0x0080 : this->u.performance_monitoring_status.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_PERFORMANCE_MONITORING_CURRENT_DATA:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.performance_monitoring_current_data.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.performance_monitoring_current_data.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.performance_monitoring_current_data.width == 0) ? 0x0080 : this->u.performance_monitoring_current_data.width, buf->curr);
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.performance_monitoring_current_data.stats_field1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.performance_monitoring_current_data.stats_field2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.performance_monitoring_current_data.stats_field3))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.performance_monitoring_current_data.stats_field4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.performance_monitoring_current_data.stats_field5))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.performance_monitoring_current_data.stats_field6))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.performance_monitoring_current_data.stats_field7))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.performance_monitoring_current_data.stats_field8))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.performance_monitoring_current_data.stats_field9))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.performance_monitoring_current_data.stats_field10))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.performance_monitoring_current_data.stats_field11))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.performance_monitoring_current_data.stats_field12))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.performance_monitoring_current_data.stats_field13))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.performance_monitoring_current_data.stats_field14))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.performance_monitoring_current_data.stats_field15))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.performance_monitoring_current_data.stats_field16))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.performance_monitoring_current_data.width == 0) ? 0x0080 : this->u.performance_monitoring_current_data.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_PERFORMANCE_MONITORING_HISTORY_DATA:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.performance_monitoring_history_data.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.performance_monitoring_history_data.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.performance_monitoring_history_data.width == 0) ? 0x0080 : this->u.performance_monitoring_history_data.width, buf->curr);
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.performance_monitoring_history_data.stats_field1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.performance_monitoring_history_data.stats_field2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.performance_monitoring_history_data.stats_field3))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.performance_monitoring_history_data.stats_field4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.performance_monitoring_history_data.stats_field5))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.performance_monitoring_history_data.stats_field6))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.performance_monitoring_history_data.stats_field7))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.performance_monitoring_history_data.stats_field8))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.performance_monitoring_history_data.stats_field9))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.performance_monitoring_history_data.stats_field10))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.performance_monitoring_history_data.stats_field11))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.performance_monitoring_history_data.stats_field12))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.performance_monitoring_history_data.stats_field13))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.performance_monitoring_history_data.stats_field14))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.performance_monitoring_history_data.stats_field15))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.performance_monitoring_history_data.stats_field16))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.performance_monitoring_history_data.width == 0) ? 0x0080 : this->u.performance_monitoring_history_data.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_TX_POWER_SUPPLY_CONTROL:
            {
                uint8_t width = 0;
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &width))
                {
                    return BCMOS_FALSE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, width, buf->curr);
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.onu_tx_power_supply_control.action))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_mac_address(&postLenBuf, &this->u.onu_tx_power_supply_control.onu_id))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.onu_tx_power_supply_control.opt_id))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.def.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.def.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.def.width == 0) ? 0x0080 : this->u.def.width, buf->curr);
                this->u.def.unknown_count = bcmolt_epon_oam_ctc_ext_attribute_value_base_def_count_unknown(&postLenBuf);
                if ((this->u.def.unknown_count > 0) && (this->u.def.unknown == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"unknown\" of struct \"bcmolt_epon_oam_ctc_ext_attribute_value_base_def\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.def.unknown = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.def.unknown_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.def.unknown, this->u.def.unknown_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.def.width == 0) ? 0x0080 : this->u.def.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_ext_attribute_value_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_ctc_leaf_ext_attribute leaf;
    if (!bcmolt_epon_oam_ctc_leaf_ext_attribute_unpack(&leaf, packed))
    {
        return BCMOS_FALSE;
    }

    switch (leaf)
    {
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_PPPO_ETEST_RESULT:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_PPPO_ETEST_CONFIGURATION:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 64))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 32))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_END:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                uint32_t unknown_elem_count = 0;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                    {
                        break;
                    }

                    unknown_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(unknown_elem_count * sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_SERIAL_NUMBER:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 6))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 16))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_FIRMWARE_VERSION:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                uint32_t firmware_version_elem_count = 0;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                    {
                        break;
                    }

                    firmware_version_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(firmware_version_elem_count * sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_CHIPSET_ID:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 3))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_CAPABILITIES1:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_OPTICAL_TRANSCEIVER_DIAGNOSIS:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_SERVICE_SLA:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_ctc_onu_service_sla_base_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_CAPABILITIES2:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                uint8_t interfaces_count;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &interfaces_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_ctc_onu_interface) * interfaces_count);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, interfaces_count * 6))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_HOLDOVER_CONFIG:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_MXU_MANAGE_GLOBAL_PARAMETER:
            {
                if (!bcmolt_epon_oam_ctc_mxu_global_params_base_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_MXU_MANAGE_SNMP_PARAMETER:
            {
                if (!bcmolt_epon_oam_ctc_mxu_snmp_params_base_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ACTIVE_PON_IFADMIN:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_CAPABILITIES3:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ETH_LINK_STATE:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ETH_PORT_PAUSE:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ETH_PORT_POLICING:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_ctc_eth_port_policing_config_base_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_VOIP_PORT:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_E1PORT:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ETH_PORT_DOWN_RATE_LIMITING:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 3))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 3))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_PORT_LOOP_DETECT:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_VLAN:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_ctc_vlan_prov_base_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_CLASSIFICATION_AND_MARKING:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                uint8_t rules_count;
                uint8_t i0;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &rules_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_ctc_rule) * rules_count);
                for (i0 = 0; i0 < rules_count; i0++)
                {
                    if (!bcmolt_epon_oam_ctc_rule_scan(&postLenBuf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_MULTICAST_VLAN:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_ctc_multicast_vlan_prov_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_MULTICAST_TAG_OPERATION:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_ctc_multicast_tag_operation_base_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_MULTICAST_SWITCH:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_MULTICAST_CONTROL:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_ctc_multicast_control_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_GROUP_MAX:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_FAST_LEAVE_ABILITY:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                uint32_t fast_leave_modes_count;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &fast_leave_modes_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint32_t) * fast_leave_modes_count);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, fast_leave_modes_count * 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_FAST_LEAVE_ADMIN_STATE:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_LLID_QUEUE_CONFIG:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                uint8_t llid_queue_table_count;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &llid_queue_table_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_ctc_onu_llid_queue) * llid_queue_table_count);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, llid_queue_table_count * 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_IAD_INFORMATION:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 6))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 32))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 32))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_VOIP_GLOBAL_PARAMETERS:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 32))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 32))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_H248PARAMETERS:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 64))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_H248USER_TID_INFORMATION:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 32))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_H248RTP_TID_CONFIGURATION:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_H248RTP_TID_INFORMATION:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 32))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_SIP_PARAMETERS:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_SIP_USER_PARAMETERS:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 32))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_FAX_MODEM_CONFIGURATION:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_H248IAD_OPERATION_STATUS:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_POTS_STATUS:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_IAD_OPERATION:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_SIP_DIGIT_MAP:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                uint16_t sip_digital_map_count;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &sip_digital_map_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * sip_digital_map_count);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, sip_digital_map_count * 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ALARM_ADMIN_STATE:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ALARM_THRESHOLD:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_VERSION_SERVER_PARA:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_MAC_LIMIT:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_MAC_AGING_TIME:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PORT_MAC_FILTER:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                uint8_t number_of_entries;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &number_of_entries))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_zte_vlan_mac) * number_of_entries);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, number_of_entries * 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PORT_MAC_BINDING:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                uint8_t number_of_entries;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &number_of_entries))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_zte_vlan_mac) * number_of_entries);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, number_of_entries * 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PORT_MAC_STATIC:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                uint8_t number_of_entries;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &number_of_entries))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_zte_vlan_mac) * number_of_entries);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, number_of_entries * 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PERFORMANCE_STAT:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PORT_ISOLATE:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_MAC_ADDRESS_TABLE_QUERY:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PON_MAC_DOWNSTREAM_SHAPING:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 3))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 3))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PON_MAC_USDSBUFFER_CAPABILITY_QUERY:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 3))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 3))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 3))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 3))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PON_MAC_USDSBUFFER:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 3))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PORT_STATISTICS_COLLECT_CONTROL:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 3))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PORT_STATISTICS_COUNTER_RESET:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PORT_FLUX_STATISTICS_COUNTER:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_LIGHT_EXCEPTION:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_LIGHT_CONTROL:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 6))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PON_PORT_STATISTICS_GET1:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PON_PORT_STATISTICS_GET2:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ALARM_CONFIG:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ROUGUE_ONU_EXCL_ABILITY:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_POWER_SAVING_CAPABILITIES:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_POWER_SAVING_CONFIG:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 6))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_PROTECTION_PARAMETERS:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_PORT_DISABLE_ON_LOOP_DETECTED:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_MAC_AGING_TIME:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_PERFORMANCE_MONITORING_STATUS:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_PERFORMANCE_MONITORING_CURRENT_DATA:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_PERFORMANCE_MONITORING_HISTORY_DATA:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_LEAF_EXT_ATTRIBUTE_ONU_TX_POWER_SUPPLY_CONTROL:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 6))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                uint32_t unknown_elem_count = 0;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                    {
                        break;
                    }

                    unknown_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(unknown_elem_count * sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_ext_attribute_value_base_def_count_unknown(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_ext_attribute_value_base_end_count_unknown(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_ext_attribute_value_base_firmware_version_count_firmware_version(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_file_check_base_pack(bcmolt_epon_oam_ctc_file_check_base *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_ctc_file_check_opcode_pack(this->opcode, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->opcode)
    {
        case BCMOLT_EPON_OAM_CTC_FILE_CHECK_OPCODE_END_DOWNLOAD_REQUEST:
            {
                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.end_download_request.file_size))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_FILE_CHECK_OPCODE_END_DOWNLOAD_RESPONSE:
            {
                if (!bcmolt_epon_oam_ctc_rps_code_pack(this->u.end_download_response.rps_code, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_file_check_base_get_packed_length(bcmolt_epon_oam_ctc_file_check_base *this)
{
    uint32_t count = 2;
    switch (this->opcode)
    {
        case BCMOLT_EPON_OAM_CTC_FILE_CHECK_OPCODE_END_DOWNLOAD_REQUEST:
            {
                count += 4;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_FILE_CHECK_OPCODE_END_DOWNLOAD_RESPONSE:
            {
                count += 1;
            }
            break;
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_file_check_base_unpack(bcmolt_epon_oam_ctc_file_check_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_ctc_file_check_opcode_unpack(&this->opcode, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->opcode)
    {
        case BCMOLT_EPON_OAM_CTC_FILE_CHECK_OPCODE_END_DOWNLOAD_REQUEST:
            {
                if (!bcmolt_epon_oam_buf_read_u32(buf, &this->u.end_download_request.file_size))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_FILE_CHECK_OPCODE_END_DOWNLOAD_RESPONSE:
            {
                if (!bcmolt_epon_oam_ctc_rps_code_unpack(&this->u.end_download_response.rps_code, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_file_check_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_ctc_file_check_opcode opcode;
    if (!bcmolt_epon_oam_ctc_file_check_opcode_unpack(&opcode, packed))
    {
        return BCMOS_FALSE;
    }

    switch (opcode)
    {
        case BCMOLT_EPON_OAM_CTC_FILE_CHECK_OPCODE_END_DOWNLOAD_REQUEST:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_FILE_CHECK_OPCODE_END_DOWNLOAD_RESPONSE:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_oui_version_pair_pack(bcmolt_epon_oam_ctc_oui_version_pair *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_well_known_oui_pack(this->oui, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->version))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_oui_version_pair_unpack(bcmolt_epon_oam_ctc_oui_version_pair *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_well_known_oui_unpack(&this->oui, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->version))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_oui_version_pair_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 4);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_performance_monitoring_data_pack(bcmolt_epon_oam_ctc_performance_monitoring_data *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u64(buf, this->downstream_drop_events))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->upstream_drop_events))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->downstream_octets))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->upstream_octets))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->downstream_frames))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->upstream_frames))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->downstream_broadcast_frames))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->upstream_broadcast_frames))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->downstream_multicast_frames))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->upstream_multicast_frames))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->downstream_crc_errored_frames))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->upstream_crc_errored_frames))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->downstream_undersize_frames))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->upstream_undersize_frames))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->downstream_oversize_frames))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->upstream_oversize_frames))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->downstream_fragments))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->upstream_fragments))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->downstream_jabbers))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->upstream_jabbers))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->downstream_frames64octets))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->downstream_frames65to127octets))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->downstream_frames128to255octets))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->downstream_frames256to511octets))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->downstream_frames512to1023octets))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->downstream_frames1024to1518octets))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->upstream_frames64octets))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->upstream_frames65to127octets))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->upstream_frames128to255octets))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->upstream_frames256to511octets))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->upstream_frames512to1023octets))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->upstream_frames1024to1518octets))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->downstream_discards))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->upstream_discards))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->downstream_errors))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->upstream_errors))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->status_change_times))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_performance_monitoring_data_unpack(bcmolt_epon_oam_ctc_performance_monitoring_data *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->downstream_drop_events))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->upstream_drop_events))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->downstream_octets))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->upstream_octets))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->downstream_frames))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->upstream_frames))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->downstream_broadcast_frames))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->upstream_broadcast_frames))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->downstream_multicast_frames))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->upstream_multicast_frames))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->downstream_crc_errored_frames))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->upstream_crc_errored_frames))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->downstream_undersize_frames))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->upstream_undersize_frames))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->downstream_oversize_frames))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->upstream_oversize_frames))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->downstream_fragments))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->upstream_fragments))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->downstream_jabbers))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->upstream_jabbers))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->downstream_frames64octets))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->downstream_frames65to127octets))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->downstream_frames128to255octets))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->downstream_frames256to511octets))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->downstream_frames512to1023octets))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->downstream_frames1024to1518octets))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->upstream_frames64octets))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->upstream_frames65to127octets))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->upstream_frames128to255octets))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->upstream_frames256to511octets))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->upstream_frames512to1023octets))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->upstream_frames1024to1518octets))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->downstream_discards))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->upstream_discards))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->downstream_errors))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->upstream_errors))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->status_change_times))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_performance_monitoring_data_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 296);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_tftp_base_pack(bcmolt_epon_oam_ctc_tftp_base *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_ctc_tftp_op_code_pack(this->opcode, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->opcode)
    {
        case BCMOLT_EPON_OAM_CTC_TFTP_OP_CODE_WRITE_REQUEST:
            {
                if ((this->u.write_request.filename_count > 0) && (this->u.write_request.filename == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"filename\" of struct \"bcmolt_epon_oam_ctc_tftp_base_write_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.write_request.filename, this->u.write_request.filename_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, 0))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.write_request.mode_count > 0) && (this->u.write_request.mode == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"mode\" of struct \"bcmolt_epon_oam_ctc_tftp_base_write_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.write_request.mode, this->u.write_request.mode_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, 0))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_TFTP_OP_CODE_DATA:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.data.block_number))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.data.data_count > 0) && (this->u.data.data == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"data\" of struct \"bcmolt_epon_oam_ctc_tftp_base_data\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.data.data, this->u.data.data_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_TFTP_OP_CODE_ACK:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.ack.block_number))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_TFTP_OP_CODE_ERROR:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.error.code))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.error.message_count > 0) && (this->u.error.message == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"message\" of struct \"bcmolt_epon_oam_ctc_tftp_base_error\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.error.message, this->u.error.message_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, 0))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_tftp_base_get_packed_length(bcmolt_epon_oam_ctc_tftp_base *this)
{
    uint32_t count = 2;
    switch (this->opcode)
    {
        case BCMOLT_EPON_OAM_CTC_TFTP_OP_CODE_WRITE_REQUEST:
            {
                count += (this->u.write_request.filename_count + 1) + (this->u.write_request.mode_count + 1);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_TFTP_OP_CODE_DATA:
            {
                count += 2 + this->u.data.data_count;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_TFTP_OP_CODE_ACK:
            {
                count += 2;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_TFTP_OP_CODE_ERROR:
            {
                count += 2 + (this->u.error.message_count + 1);
            }
            break;
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_tftp_base_unpack(bcmolt_epon_oam_ctc_tftp_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_ctc_tftp_op_code_unpack(&this->opcode, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->opcode)
    {
        case BCMOLT_EPON_OAM_CTC_TFTP_OP_CODE_WRITE_REQUEST:
            {
                this->u.write_request.filename_count = bcmolt_epon_oam_ctc_tftp_base_write_request_count_filename(buf);
                if ((this->u.write_request.filename_count > 0) && (this->u.write_request.filename == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"filename\" of struct \"bcmolt_epon_oam_ctc_tftp_base_write_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.write_request.filename = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.write_request.filename_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.write_request.filename, this->u.write_request.filename_count))
                {
                    return BCMOS_FALSE;
                }

                this->u.write_request.mode_count = bcmolt_epon_oam_ctc_tftp_base_write_request_count_mode(buf);
                if ((this->u.write_request.mode_count > 0) && (this->u.write_request.mode == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"mode\" of struct \"bcmolt_epon_oam_ctc_tftp_base_write_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.write_request.mode = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.write_request.mode_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.write_request.mode, this->u.write_request.mode_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_TFTP_OP_CODE_DATA:
            {
                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.data.block_number))
                {
                    return BCMOS_FALSE;
                }

                this->u.data.data_count = bcmolt_epon_oam_ctc_tftp_base_data_count_data(buf);
                if ((this->u.data.data_count > 0) && (this->u.data.data == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"data\" of struct \"bcmolt_epon_oam_ctc_tftp_base_data\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.data.data = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.data.data_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.data.data, this->u.data.data_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_TFTP_OP_CODE_ACK:
            {
                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.ack.block_number))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_TFTP_OP_CODE_ERROR:
            {
                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.error.code))
                {
                    return BCMOS_FALSE;
                }

                this->u.error.message_count = bcmolt_epon_oam_ctc_tftp_base_error_count_message(buf);
                if ((this->u.error.message_count > 0) && (this->u.error.message == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"message\" of struct \"bcmolt_epon_oam_ctc_tftp_base_error\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.error.message = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.error.message_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.error.message, this->u.error.message_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_tftp_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_ctc_tftp_op_code opcode;
    if (!bcmolt_epon_oam_ctc_tftp_op_code_unpack(&opcode, packed))
    {
        return BCMOS_FALSE;
    }

    switch (opcode)
    {
        case BCMOLT_EPON_OAM_CTC_TFTP_OP_CODE_WRITE_REQUEST:
            {
                uint32_t filename_elem_count = 0;
                uint32_t mode_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    uint8_t dummy;
                    if (!bcmolt_epon_oam_buf_read_u8(packed, &dummy))
                    {
                        break;
                    }

                    if (dummy == 0)
                    {
                        break;
                    }

                    filename_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(filename_elem_count * sizeof(uint8_t));
                while (BCMOS_TRUE)
                {
                    uint8_t dummy;
                    if (!bcmolt_epon_oam_buf_read_u8(packed, &dummy))
                    {
                        break;
                    }

                    if (dummy == 0)
                    {
                        break;
                    }

                    mode_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(mode_elem_count * sizeof(uint8_t));
            }
            break;
        case BCMOLT_EPON_OAM_CTC_TFTP_OP_CODE_DATA:
            {
                uint32_t data_elem_count = 0;
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(packed, 1))
                    {
                        break;
                    }

                    data_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(data_elem_count * sizeof(uint8_t));
            }
            break;
        case BCMOLT_EPON_OAM_CTC_TFTP_OP_CODE_ACK:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_TFTP_OP_CODE_ERROR:
            {
                uint32_t message_elem_count = 0;
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                while (BCMOS_TRUE)
                {
                    uint8_t dummy;
                    if (!bcmolt_epon_oam_buf_read_u8(packed, &dummy))
                    {
                        break;
                    }

                    if (dummy == 0)
                    {
                        break;
                    }

                    message_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(message_elem_count * sizeof(uint8_t));
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_tftp_base_write_request_count_filename(bcmolt_epon_oam_buf *buf)
{
    uint32_t count = 0;
    uint8_t dummy;
    bcmolt_epon_oam_buf bufClone = *buf;
    while (BCMOS_TRUE)
    {
        if (!bcmolt_epon_oam_buf_read_u8(&bufClone, &dummy))
        {
            break;
        }

        if (dummy == 0)
        {
            break;
        }

        count += 1;
    }

    return count;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_tftp_base_write_request_count_mode(bcmolt_epon_oam_buf *buf)
{
    uint32_t count = 0;
    uint8_t dummy;
    bcmolt_epon_oam_buf bufClone = *buf;
    while (BCMOS_TRUE)
    {
        if (!bcmolt_epon_oam_buf_read_u8(&bufClone, &dummy))
        {
            break;
        }

        if (dummy == 0)
        {
            break;
        }

        count += 1;
    }

    return count;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_tftp_base_data_count_data(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_tftp_base_error_count_message(bcmolt_epon_oam_buf *buf)
{
    uint32_t count = 0;
    uint8_t dummy;
    bcmolt_epon_oam_buf bufClone = *buf;
    while (BCMOS_TRUE)
    {
        if (!bcmolt_epon_oam_buf_read_u8(&bufClone, &dummy))
        {
            break;
        }

        if (dummy == 0)
        {
            break;
        }

        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_swmirror_base_pack(bcmolt_epon_oam_ctc_swmirror_base *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_ctc_swmirror_opcode_pack(this->opcode, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->opcode)
    {
        case BCMOLT_EPON_OAM_CTC_SWMIRROR_OPCODE_ACTIVATE_IMAGE_REQUEST:
            {
                if (!bcmolt_epon_oam_ctc_swmirror_activate_image_flag_pack(this->u.activate_image_request.flag, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_SWMIRROR_OPCODE_ACTIVATE_IMAGE_RESPONSE:
            {
                if (!bcmolt_epon_oam_ctc_swmirror_ack_pack(this->u.activate_image_response.ack, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_swmirror_base_get_packed_length(bcmolt_epon_oam_ctc_swmirror_base *this)
{
    uint32_t count = 2;
    switch (this->opcode)
    {
        case BCMOLT_EPON_OAM_CTC_SWMIRROR_OPCODE_ACTIVATE_IMAGE_REQUEST:
            {
                count += 1;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_SWMIRROR_OPCODE_ACTIVATE_IMAGE_RESPONSE:
            {
                count += 1;
            }
            break;
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_swmirror_base_unpack(bcmolt_epon_oam_ctc_swmirror_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_ctc_swmirror_opcode_unpack(&this->opcode, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->opcode)
    {
        case BCMOLT_EPON_OAM_CTC_SWMIRROR_OPCODE_ACTIVATE_IMAGE_REQUEST:
            {
                if (!bcmolt_epon_oam_ctc_swmirror_activate_image_flag_unpack(&this->u.activate_image_request.flag, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_SWMIRROR_OPCODE_ACTIVATE_IMAGE_RESPONSE:
            {
                if (!bcmolt_epon_oam_ctc_swmirror_ack_unpack(&this->u.activate_image_response.ack, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_swmirror_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_ctc_swmirror_opcode opcode;
    if (!bcmolt_epon_oam_ctc_swmirror_opcode_unpack(&opcode, packed))
    {
        return BCMOS_FALSE;
    }

    switch (opcode)
    {
        case BCMOLT_EPON_OAM_CTC_SWMIRROR_OPCODE_ACTIVATE_IMAGE_REQUEST:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_SWMIRROR_OPCODE_ACTIVATE_IMAGE_RESPONSE:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_software_download_prov_base_pack(bcmolt_epon_oam_ctc_software_download_prov_base *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_ctc_software_download_data_type_pack(this->data_type, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->data_type)
    {
        case BCMOLT_EPON_OAM_CTC_SOFTWARE_DOWNLOAD_DATA_TYPE_TFTP:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.tftp.tid))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_tftp_base_pack(&this->u.tftp.tftp, buf))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint16_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, bytesAfterLenField + 3))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint16_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_SOFTWARE_DOWNLOAD_DATA_TYPE_DATA_CHECKING:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.data_checking.tid))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_file_check_base_pack(&this->u.data_checking.file_check, buf))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint16_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, bytesAfterLenField + 3))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint16_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_SOFTWARE_DOWNLOAD_DATA_TYPE_SWMIRRORING:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.swmirroring.tid))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_swmirror_base_pack(&this->u.swmirroring.swmirror, buf))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint16_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, bytesAfterLenField + 3))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint16_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_SOFTWARE_DOWNLOAD_DATA_TYPE_COMMIT_IMAGE:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.commit_image.tid))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_commit_image_base_pack(&this->u.commit_image.commit_image, buf))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint16_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, bytesAfterLenField + 3))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint16_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_software_download_prov_base_get_packed_length(bcmolt_epon_oam_ctc_software_download_prov_base *this)
{
    uint32_t count = 1;
    switch (this->data_type)
    {
        case BCMOLT_EPON_OAM_CTC_SOFTWARE_DOWNLOAD_DATA_TYPE_TFTP:
            {
                count += 4 + bcmolt_epon_oam_ctc_tftp_base_get_packed_length(&this->u.tftp.tftp);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_SOFTWARE_DOWNLOAD_DATA_TYPE_DATA_CHECKING:
            {
                count += 4 + bcmolt_epon_oam_ctc_file_check_base_get_packed_length(&this->u.data_checking.file_check);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_SOFTWARE_DOWNLOAD_DATA_TYPE_SWMIRRORING:
            {
                count += 4 + bcmolt_epon_oam_ctc_swmirror_base_get_packed_length(&this->u.swmirroring.swmirror);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_SOFTWARE_DOWNLOAD_DATA_TYPE_COMMIT_IMAGE:
            {
                count += 4 + bcmolt_epon_oam_ctc_commit_image_base_get_packed_length(&this->u.commit_image.commit_image);
            }
            break;
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_software_download_prov_base_unpack(bcmolt_epon_oam_ctc_software_download_prov_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_ctc_software_download_data_type_unpack(&this->data_type, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->data_type)
    {
        case BCMOLT_EPON_OAM_CTC_SOFTWARE_DOWNLOAD_DATA_TYPE_TFTP:
            {
                uint16_t length = 0;
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u16(buf, &length))
                {
                    return BCMOS_FALSE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, length - 3, buf->curr);
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.tftp.tid))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_tftp_base_unpack(&this->u.tftp.tftp, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, length - 3))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_SOFTWARE_DOWNLOAD_DATA_TYPE_DATA_CHECKING:
            {
                uint16_t length = 0;
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u16(buf, &length))
                {
                    return BCMOS_FALSE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, length - 3, buf->curr);
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.data_checking.tid))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_file_check_base_unpack(&this->u.data_checking.file_check, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, length - 3))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_SOFTWARE_DOWNLOAD_DATA_TYPE_SWMIRRORING:
            {
                uint16_t length = 0;
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u16(buf, &length))
                {
                    return BCMOS_FALSE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, length - 3, buf->curr);
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.swmirroring.tid))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_swmirror_base_unpack(&this->u.swmirroring.swmirror, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, length - 3))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_SOFTWARE_DOWNLOAD_DATA_TYPE_COMMIT_IMAGE:
            {
                uint16_t length = 0;
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u16(buf, &length))
                {
                    return BCMOS_FALSE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, length - 3, buf->curr);
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.commit_image.tid))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_commit_image_base_unpack(&this->u.commit_image.commit_image, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, length - 3))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_software_download_prov_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_ctc_software_download_data_type data_type;
    if (!bcmolt_epon_oam_ctc_software_download_data_type_unpack(&data_type, packed))
    {
        return BCMOS_FALSE;
    }

    switch (data_type)
    {
        case BCMOLT_EPON_OAM_CTC_SOFTWARE_DOWNLOAD_DATA_TYPE_TFTP:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint16_t length;
                if (!bcmolt_epon_oam_buf_read_u16(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, length - 3, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_tftp_base_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, length - 3))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_SOFTWARE_DOWNLOAD_DATA_TYPE_DATA_CHECKING:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint16_t length;
                if (!bcmolt_epon_oam_buf_read_u16(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, length - 3, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_file_check_base_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, length - 3))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_SOFTWARE_DOWNLOAD_DATA_TYPE_SWMIRRORING:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint16_t length;
                if (!bcmolt_epon_oam_buf_read_u16(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, length - 3, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_swmirror_base_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, length - 3))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_SOFTWARE_DOWNLOAD_DATA_TYPE_COMMIT_IMAGE:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint16_t length;
                if (!bcmolt_epon_oam_buf_read_u16(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, length - 3, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ctc_commit_image_base_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, length - 3))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ktqueue_drop_counter_pack(bcmolt_epon_oam_ktqueue_drop_counter *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u32(buf, this->txbytes))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->dropped_frames))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ktqueue_drop_counter_unpack(bcmolt_epon_oam_ktqueue_drop_counter *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->txbytes))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->dropped_frames))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ktqueue_drop_counter_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 8);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ktattribute_value_base_pack(bcmolt_epon_oam_ktattribute_value_base *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t preLenFieldPos;
    uint32_t bytesAfterLenField;
    if (!bcmolt_epon_oam_ktleaf_attribute_pack(this->leaf, buf))
    {
        return BCMOS_FALSE;
    }

    if (this->width >= 0x0080)
    {
        bcmolt_epon_oam_buf_write_u8(buf, this->width);
        return BCMOS_TRUE;
    }

    preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

    /* skip over length field (we'll fill it in later) */
    if (!bcmolt_epon_oam_buf_skip(buf, 1))
    {
        return BCMOS_FALSE;
    }

    switch (this->leaf)
    {
        case BCMOLT_EPON_OAM_KTLEAF_ATTRIBUTE_PORT_DOWNSTREAM_RATE_SHAPING:
            {
                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.port_downstream_rate_shaping.is_activated))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u24(buf, this->u.port_downstream_rate_shaping.rate))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_KTLEAF_ATTRIBUTE_ONU_MAC_LIMIT:
            {
                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.onu_mac_limit.is_activated))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_mac_limit.limit))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_KTLEAF_ATTRIBUTE_BLOCK_UNBLOCK_ONU_TRAFFIC:
            {
                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.block_unblock_onu_traffic.block))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_KTLEAF_ATTRIBUTE_ONU_DIAGNOSTICS:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.onu_diagnostics.optics_module_temperature))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.onu_diagnostics.txoptics_power))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.onu_diagnostics.rxoptics_power))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_KTLEAF_ATTRIBUTE_ONU_QUEUE_DROP_COUNTER:
            {
                uint8_t i0;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_queue_drop_counter.upstream_queues_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.onu_queue_drop_counter.upstream_queues_count > 0) && (this->u.onu_queue_drop_counter.upstream_queues == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"upstream_queues\" of struct \"bcmolt_epon_oam_ktattribute_value_base_onu_queue_drop_counter\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i0 = 0; i0 < this->u.onu_queue_drop_counter.upstream_queues_count; i0++)
                {
                    if (!bcmolt_epon_oam_ktqueue_drop_counter_pack(&this->u.onu_queue_drop_counter.upstream_queues[i0], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_KTLEAF_ATTRIBUTE_ETHERNET_PORT_COUNTER:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.ethernet_port_counter.counter_bit_mask))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.ethernet_port_counter.txframes))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.ethernet_port_counter.txbytes))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.ethernet_port_counter.txmulticast))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.ethernet_port_counter.txbroadcast))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.ethernet_port_counter.txdropped))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.ethernet_port_counter.rxframes))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.ethernet_port_counter.rxbytes))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.ethernet_port_counter.rxmulticast))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.ethernet_port_counter.rxbroadcast))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.ethernet_port_counter.rxoversized))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.ethernet_port_counter.rxundersized))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.ethernet_port_counter.rxcrc_errors))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_KTLEAF_ATTRIBUTE_ETHERNET_PORT_RSTP:
            {
                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.ethernet_port_rstp.enabled))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_KTLEAF_ATTRIBUTE_LOOP_DETECT:
            {
                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.loop_detect.enabled))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.loop_detect.interval))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.loop_detect.block_time))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_KTLEAF_ATTRIBUTE_ONU_MPCP_COUNTER:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.onu_mpcp_counter.counter_bit_mask))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_mpcp_counter.rxhec_errors))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_mpcp_counter.rxregister))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_mpcp_counter.txregister_ack))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_mpcp_counter.rxgate_frames))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_mpcp_counter.txreport_frames))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_KTLEAF_ATTRIBUTE_OPTICAL_POWER_ALARM_STATUS:
            {
                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.optical_power_alarm_status.enabled))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ktoptical_power_alarm_status_pack(this->u.optical_power_alarm_status.alarm_status, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_KTLEAF_ATTRIBUTE_STATIC_MAC:
            {
                uint8_t i1;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.static_mac.macs_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.static_mac.macs_count > 0) && (this->u.static_mac.macs == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"macs\" of struct \"bcmolt_epon_oam_ktattribute_value_base_static_mac\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i1 = 0; i1 < this->u.static_mac.macs_count; i1++)
                {
                    if (!bcmolt_epon_oam_buf_write_mac_address(buf, this->u.static_mac.macs[i1]))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        default:
            {
            }
            break;
    }

    bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
    if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ktattribute_value_base_get_packed_length(bcmolt_epon_oam_ktattribute_value_base *this)
{
    if (this->width >= 0x0080)
    {
        return this->width;
    }
    else
    {
        uint32_t count = 3;
        switch (this->leaf)
        {
            case BCMOLT_EPON_OAM_KTLEAF_ATTRIBUTE_PORT_DOWNSTREAM_RATE_SHAPING:
                {
                    count += 4;
                }
                break;
            case BCMOLT_EPON_OAM_KTLEAF_ATTRIBUTE_ONU_MAC_LIMIT:
                {
                    count += 2;
                }
                break;
            case BCMOLT_EPON_OAM_KTLEAF_ATTRIBUTE_BLOCK_UNBLOCK_ONU_TRAFFIC:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_KTLEAF_ATTRIBUTE_ONU_DIAGNOSTICS:
                {
                    count += 6;
                }
                break;
            case BCMOLT_EPON_OAM_KTLEAF_ATTRIBUTE_ONU_QUEUE_DROP_COUNTER:
                {
                    count += 1 + (8 * this->u.onu_queue_drop_counter.upstream_queues_count);
                }
                break;
            case BCMOLT_EPON_OAM_KTLEAF_ATTRIBUTE_ETHERNET_PORT_COUNTER:
                {
                    count += 98;
                }
                break;
            case BCMOLT_EPON_OAM_KTLEAF_ATTRIBUTE_ETHERNET_PORT_RSTP:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_KTLEAF_ATTRIBUTE_LOOP_DETECT:
                {
                    count += 3;
                }
                break;
            case BCMOLT_EPON_OAM_KTLEAF_ATTRIBUTE_ONU_MPCP_COUNTER:
                {
                    count += 42;
                }
                break;
            case BCMOLT_EPON_OAM_KTLEAF_ATTRIBUTE_OPTICAL_POWER_ALARM_STATUS:
                {
                    count += 2;
                }
                break;
            case BCMOLT_EPON_OAM_KTLEAF_ATTRIBUTE_STATIC_MAC:
                {
                    count += 1 + (6 * this->u.static_mac.macs_count);
                }
                break;
            default:
                {
                }
                break;
        }

        return count;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ktattribute_value_base_unpack(bcmolt_epon_oam_ktattribute_value_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    bcmolt_epon_oam_buf postLenBuf;
    if (!bcmolt_epon_oam_ktleaf_attribute_unpack(&this->leaf, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->width))
    {
        return BCMOS_FALSE;
    }

    if (this->width >= 0x0080)
    {
        return BCMOS_TRUE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, (this->width == 0) ? 0x0080 : this->width, buf->curr);
    switch (this->leaf)
    {
        case BCMOLT_EPON_OAM_KTLEAF_ATTRIBUTE_PORT_DOWNSTREAM_RATE_SHAPING:
            {
                if (!bcmolt_epon_oam_buf_read_bool(&postLenBuf, &this->u.port_downstream_rate_shaping.is_activated))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u24(&postLenBuf, &this->u.port_downstream_rate_shaping.rate))
                {
                    /*Optional unpack fails do not cause errors */
                }
            }
            break;
        case BCMOLT_EPON_OAM_KTLEAF_ATTRIBUTE_ONU_MAC_LIMIT:
            {
                if (!bcmolt_epon_oam_buf_read_bool(&postLenBuf, &this->u.onu_mac_limit.is_activated))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.onu_mac_limit.limit))
                {
                    /*Optional unpack fails do not cause errors */
                }
            }
            break;
        case BCMOLT_EPON_OAM_KTLEAF_ATTRIBUTE_BLOCK_UNBLOCK_ONU_TRAFFIC:
            {
                if (!bcmolt_epon_oam_buf_read_bool(&postLenBuf, &this->u.block_unblock_onu_traffic.block))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_KTLEAF_ATTRIBUTE_ONU_DIAGNOSTICS:
            {
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.onu_diagnostics.optics_module_temperature))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.onu_diagnostics.txoptics_power))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.onu_diagnostics.rxoptics_power))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_KTLEAF_ATTRIBUTE_ONU_QUEUE_DROP_COUNTER:
            {
                uint8_t i0;
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.onu_queue_drop_counter.upstream_queues_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.onu_queue_drop_counter.upstream_queues_count > 0) && (this->u.onu_queue_drop_counter.upstream_queues == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"upstream_queues\" of struct \"bcmolt_epon_oam_ktattribute_value_base_onu_queue_drop_counter\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.onu_queue_drop_counter.upstream_queues = (bcmolt_epon_oam_ktqueue_drop_counter *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.onu_queue_drop_counter.upstream_queues_count * sizeof(bcmolt_epon_oam_ktqueue_drop_counter));
                    }
                }

                for (i0 = 0; i0 < this->u.onu_queue_drop_counter.upstream_queues_count; i0++)
                {
                    if (!bcmolt_epon_oam_ktqueue_drop_counter_unpack(&this->u.onu_queue_drop_counter.upstream_queues[i0], &postLenBuf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_KTLEAF_ATTRIBUTE_ETHERNET_PORT_COUNTER:
            {
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.ethernet_port_counter.counter_bit_mask))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.ethernet_port_counter.txframes))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.ethernet_port_counter.txbytes))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.ethernet_port_counter.txmulticast))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.ethernet_port_counter.txbroadcast))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.ethernet_port_counter.txdropped))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.ethernet_port_counter.rxframes))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.ethernet_port_counter.rxbytes))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.ethernet_port_counter.rxmulticast))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.ethernet_port_counter.rxbroadcast))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.ethernet_port_counter.rxoversized))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.ethernet_port_counter.rxundersized))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.ethernet_port_counter.rxcrc_errors))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_KTLEAF_ATTRIBUTE_ETHERNET_PORT_RSTP:
            {
                if (!bcmolt_epon_oam_buf_read_bool(&postLenBuf, &this->u.ethernet_port_rstp.enabled))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_KTLEAF_ATTRIBUTE_LOOP_DETECT:
            {
                if (!bcmolt_epon_oam_buf_read_bool(&postLenBuf, &this->u.loop_detect.enabled))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.loop_detect.interval))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.loop_detect.block_time))
                {
                    /*Optional unpack fails do not cause errors */
                }
            }
            break;
        case BCMOLT_EPON_OAM_KTLEAF_ATTRIBUTE_ONU_MPCP_COUNTER:
            {
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.onu_mpcp_counter.counter_bit_mask))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_mpcp_counter.rxhec_errors))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_mpcp_counter.rxregister))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_mpcp_counter.txregister_ack))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_mpcp_counter.rxgate_frames))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.onu_mpcp_counter.txreport_frames))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_KTLEAF_ATTRIBUTE_OPTICAL_POWER_ALARM_STATUS:
            {
                if (!bcmolt_epon_oam_buf_read_bool(&postLenBuf, &this->u.optical_power_alarm_status.enabled))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ktoptical_power_alarm_status_unpack(&this->u.optical_power_alarm_status.alarm_status, &postLenBuf))
                {
                    /*Optional unpack fails do not cause errors */
                }
            }
            break;
        case BCMOLT_EPON_OAM_KTLEAF_ATTRIBUTE_STATIC_MAC:
            {
                uint8_t i1;
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.static_mac.macs_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.static_mac.macs_count > 0) && (this->u.static_mac.macs == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"macs\" of struct \"bcmolt_epon_oam_ktattribute_value_base_static_mac\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.static_mac.macs = (bcmos_mac_address *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.static_mac.macs_count * sizeof(bcmos_mac_address));
                    }
                }

                for (i1 = 0; i1 < this->u.static_mac.macs_count; i1++)
                {
                    if (!bcmolt_epon_oam_buf_read_mac_address(&postLenBuf, &this->u.static_mac.macs[i1]))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(buf, (this->width == 0) ? 0x0080 : this->width))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ktattribute_value_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_ktleaf_attribute leaf;
    bcmolt_epon_oam_buf postLenBuf;
    uint8_t length;
    if (!bcmolt_epon_oam_ktleaf_attribute_unpack(&leaf, packed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
    {
        return BCMOS_FALSE;
    }

    if (length >= 0x0080)
    {
        return BCMOS_TRUE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
    switch (leaf)
    {
        case BCMOLT_EPON_OAM_KTLEAF_ATTRIBUTE_PORT_DOWNSTREAM_RATE_SHAPING:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 3))
                {
                    /*Optional unpack fails do not cause errors */
                }
            }
            break;
        case BCMOLT_EPON_OAM_KTLEAF_ATTRIBUTE_ONU_MAC_LIMIT:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    /*Optional unpack fails do not cause errors */
                }
            }
            break;
        case BCMOLT_EPON_OAM_KTLEAF_ATTRIBUTE_BLOCK_UNBLOCK_ONU_TRAFFIC:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_KTLEAF_ATTRIBUTE_ONU_DIAGNOSTICS:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_KTLEAF_ATTRIBUTE_ONU_QUEUE_DROP_COUNTER:
            {
                uint8_t upstream_queues_count;
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &upstream_queues_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_ktqueue_drop_counter) * upstream_queues_count);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, upstream_queues_count * 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_KTLEAF_ATTRIBUTE_ETHERNET_PORT_COUNTER:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_KTLEAF_ATTRIBUTE_ETHERNET_PORT_RSTP:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_KTLEAF_ATTRIBUTE_LOOP_DETECT:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    /*Optional unpack fails do not cause errors */
                }
            }
            break;
        case BCMOLT_EPON_OAM_KTLEAF_ATTRIBUTE_ONU_MPCP_COUNTER:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_KTLEAF_ATTRIBUTE_OPTICAL_POWER_ALARM_STATUS:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    /*Optional unpack fails do not cause errors */
                }
            }
            break;
        case BCMOLT_EPON_OAM_KTLEAF_ATTRIBUTE_STATIC_MAC:
            {
                uint8_t macs_count;
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &macs_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmos_mac_address) * macs_count);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, macs_count * 6))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ktaction_value_base_pack(bcmolt_epon_oam_ktaction_value_base *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_ktleaf_action_pack(this->leaf, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->leaf)
    {
        case BCMOLT_EPON_OAM_KTLEAF_ACTION_ONU_COUNTER_CLEAR:
            {
            }
            break;
        case BCMOLT_EPON_OAM_KTLEAF_ACTION_RESTORE_ONU:
            {
                if ((this->u.restore_onu.unknown_count > 0) && (this->u.restore_onu.unknown == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"unknown\" of struct \"bcmolt_epon_oam_ktaction_value_base_restore_onu\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.restore_onu.unknown, this->u.restore_onu.unknown_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_KTLEAF_ACTION_TXPOWER_OFF:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (this->u.txpower_off.length >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.txpower_off.length);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.txpower_off.is_power_off))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.txpower_off.duration))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_KTLEAF_ACTION_END:
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ktaction_value_base_get_packed_length(bcmolt_epon_oam_ktaction_value_base *this)
{
    uint32_t count = 2;
    switch (this->leaf)
    {
        case BCMOLT_EPON_OAM_KTLEAF_ACTION_ONU_COUNTER_CLEAR:
            {
            }
            break;
        case BCMOLT_EPON_OAM_KTLEAF_ACTION_RESTORE_ONU:
            {
                count += this->u.restore_onu.unknown_count;
            }
            break;
        case BCMOLT_EPON_OAM_KTLEAF_ACTION_TXPOWER_OFF:
            {
                count += 3;
            }
            break;
        case BCMOLT_EPON_OAM_KTLEAF_ACTION_END:
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ktaction_value_base_unpack(bcmolt_epon_oam_ktaction_value_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_ktleaf_action_unpack(&this->leaf, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->leaf)
    {
        case BCMOLT_EPON_OAM_KTLEAF_ACTION_ONU_COUNTER_CLEAR:
            {
            }
            break;
        case BCMOLT_EPON_OAM_KTLEAF_ACTION_RESTORE_ONU:
            {
                this->u.restore_onu.unknown_count = bcmolt_epon_oam_ktaction_value_base_restore_onu_count_unknown(buf);
                if ((this->u.restore_onu.unknown_count > 0) && (this->u.restore_onu.unknown == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"unknown\" of struct \"bcmolt_epon_oam_ktaction_value_base_restore_onu\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.restore_onu.unknown = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.restore_onu.unknown_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.restore_onu.unknown, this->u.restore_onu.unknown_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_KTLEAF_ACTION_TXPOWER_OFF:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.txpower_off.length))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.txpower_off.length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.txpower_off.length == 0) ? 0x0080 : this->u.txpower_off.length, buf->curr);
                if (!bcmolt_epon_oam_buf_read_bool(&postLenBuf, &this->u.txpower_off.is_power_off))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.txpower_off.duration))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.txpower_off.length == 0) ? 0x0080 : this->u.txpower_off.length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_KTLEAF_ACTION_END:
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ktaction_value_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_ktleaf_action leaf;
    if (!bcmolt_epon_oam_ktleaf_action_unpack(&leaf, packed))
    {
        return BCMOS_FALSE;
    }

    switch (leaf)
    {
        case BCMOLT_EPON_OAM_KTLEAF_ACTION_ONU_COUNTER_CLEAR:
            {
            }
            break;
        case BCMOLT_EPON_OAM_KTLEAF_ACTION_RESTORE_ONU:
            {
                uint32_t unknown_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(packed, 1))
                    {
                        break;
                    }

                    unknown_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(unknown_elem_count * sizeof(uint8_t));
            }
            break;
        case BCMOLT_EPON_OAM_KTLEAF_ACTION_TXPOWER_OFF:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_KTLEAF_ACTION_END:
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ktaction_value_base_restore_onu_count_unknown(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_var_container_base_pack(bcmolt_epon_oam_ctc_var_container_base *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_ctc_branch_pack(this->branch, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->branch)
    {
        case BCMOLT_EPON_OAM_CTC_BRANCH_END:
            {
                if ((this->u.end.unknown_count > 0) && (this->u.end.unknown == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"unknown\" of struct \"bcmolt_epon_oam_ctc_var_container_base_end\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.end.unknown, this->u.end.unknown_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_ctc_attribute_value_base_pack(&this->u.attribute.attribute, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_ACTION:
            {
                if (!bcmolt_epon_oam_ctc_action_value_pack(&this->u.action.action, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_OLD_MANAGEMENT_OBJECT:
            {
                if (!bcmolt_epon_oam_ctc_old_management_object_base_pack(&this->u.old_management_object.object, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_MANAGEMENT_OBJECT:
            {
                if (!bcmolt_epon_oam_ctc_management_object_base_pack(&this->u.management_object.object, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_EXT_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_ctc_ext_attribute_value_base_pack(&this->u.ext_attribute.attribute, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_EXT_ACTION:
            {
                if (!bcmolt_epon_oam_ctc_ext_action_value_base_pack(&this->u.ext_action.attribute, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_KTATTRIBUTE:
            {
                if (!bcmolt_epon_oam_ktattribute_value_base_pack(&this->u.ktattribute.attribute, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_KTACTION:
            {
                if (!bcmolt_epon_oam_ktaction_value_base_pack(&this->u.ktaction.attribute, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.def.leaf))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.def.length >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.def.length);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_var_container_base_get_packed_length(bcmolt_epon_oam_ctc_var_container_base *this)
{
    uint32_t count = 1;
    switch (this->branch)
    {
        case BCMOLT_EPON_OAM_CTC_BRANCH_END:
            {
                count += this->u.end.unknown_count;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_ATTRIBUTE:
            {
                count += bcmolt_epon_oam_ctc_attribute_value_base_get_packed_length(&this->u.attribute.attribute);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_ACTION:
            {
                count += bcmolt_epon_oam_ctc_action_value_get_packed_length(&this->u.action.action);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_OLD_MANAGEMENT_OBJECT:
            {
                count += bcmolt_epon_oam_ctc_old_management_object_base_get_packed_length(&this->u.old_management_object.object);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_MANAGEMENT_OBJECT:
            {
                count += bcmolt_epon_oam_ctc_management_object_base_get_packed_length(&this->u.management_object.object);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_EXT_ATTRIBUTE:
            {
                count += bcmolt_epon_oam_ctc_ext_attribute_value_base_get_packed_length(&this->u.ext_attribute.attribute);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_EXT_ACTION:
            {
                count += bcmolt_epon_oam_ctc_ext_action_value_base_get_packed_length(&this->u.ext_action.attribute);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_KTATTRIBUTE:
            {
                count += bcmolt_epon_oam_ktattribute_value_base_get_packed_length(&this->u.ktattribute.attribute);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_KTACTION:
            {
                count += bcmolt_epon_oam_ktaction_value_base_get_packed_length(&this->u.ktaction.attribute);
            }
            break;
        default:
            {
                count += 3;
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_var_container_base_unpack(bcmolt_epon_oam_ctc_var_container_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_ctc_branch_unpack(&this->branch, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->branch)
    {
        case BCMOLT_EPON_OAM_CTC_BRANCH_END:
            {
                this->u.end.unknown_count = bcmolt_epon_oam_ctc_var_container_base_end_count_unknown(buf);
                if ((this->u.end.unknown_count > 0) && (this->u.end.unknown == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"unknown\" of struct \"bcmolt_epon_oam_ctc_var_container_base_end\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.end.unknown = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.end.unknown_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.end.unknown, this->u.end.unknown_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_ctc_attribute_value_base_unpack(&this->u.attribute.attribute, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_ACTION:
            {
                if (!bcmolt_epon_oam_ctc_action_value_unpack(&this->u.action.action, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_OLD_MANAGEMENT_OBJECT:
            {
                if (!bcmolt_epon_oam_ctc_old_management_object_base_unpack(&this->u.old_management_object.object, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_MANAGEMENT_OBJECT:
            {
                if (!bcmolt_epon_oam_ctc_management_object_base_unpack(&this->u.management_object.object, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_EXT_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_ctc_ext_attribute_value_base_unpack(&this->u.ext_attribute.attribute, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_EXT_ACTION:
            {
                if (!bcmolt_epon_oam_ctc_ext_action_value_base_unpack(&this->u.ext_action.attribute, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_KTATTRIBUTE:
            {
                if (!bcmolt_epon_oam_ktattribute_value_base_unpack(&this->u.ktattribute.attribute, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_KTACTION:
            {
                if (!bcmolt_epon_oam_ktaction_value_base_unpack(&this->u.ktaction.attribute, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.def.leaf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.def.length))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.def.length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.def.length == 0) ? 0x0080 : this->u.def.length, buf->curr);
                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.def.length == 0) ? 0x0080 : this->u.def.length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_var_container_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_ctc_branch branch;
    if (!bcmolt_epon_oam_ctc_branch_unpack(&branch, packed))
    {
        return BCMOS_FALSE;
    }

    switch (branch)
    {
        case BCMOLT_EPON_OAM_CTC_BRANCH_END:
            {
                uint32_t unknown_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(packed, 1))
                    {
                        break;
                    }

                    unknown_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(unknown_elem_count * sizeof(uint8_t));
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_ctc_attribute_value_base_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_ACTION:
            {
                if (!bcmolt_epon_oam_ctc_action_value_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_OLD_MANAGEMENT_OBJECT:
            {
                if (!bcmolt_epon_oam_ctc_old_management_object_base_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_MANAGEMENT_OBJECT:
            {
                if (!bcmolt_epon_oam_ctc_management_object_base_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_EXT_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_ctc_ext_attribute_value_base_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_EXT_ACTION:
            {
                if (!bcmolt_epon_oam_ctc_ext_action_value_base_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_KTATTRIBUTE:
            {
                if (!bcmolt_epon_oam_ktattribute_value_base_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_KTACTION:
            {
                if (!bcmolt_epon_oam_ktaction_value_base_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_var_container_base_end_count_unknown(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_var_descriptor_pack(bcmolt_epon_oam_ctc_var_descriptor *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_ctc_branch_pack(this->branch, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->branch)
    {
        case BCMOLT_EPON_OAM_CTC_BRANCH_END:
            {
                if ((this->u.end.unknown_count > 0) && (this->u.end.unknown == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"unknown\" of struct \"bcmolt_epon_oam_ctc_var_descriptor_end\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.end.unknown, this->u.end.unknown_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_var_leaf_attribute_pack(this->u.attribute.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_ACTION:
            {
                if (!bcmolt_epon_oam_var_leaf_action_pack(this->u.action.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_OLD_MANAGEMENT_OBJECT:
            {
                if (!bcmolt_epon_oam_ctc_old_management_object_base_pack(&this->u.old_management_object.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_MANAGEMENT_OBJECT:
            {
                if (!bcmolt_epon_oam_ctc_management_object_base_pack(&this->u.management_object.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_EXT_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_ctc_leaf_ext_attribute_pack(this->u.ext_attribute.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_EXT_ACTION:
            {
                if (!bcmolt_epon_oam_ctc_leaf_ext_action_pack(this->u.ext_action.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_KTATTRIBUTE:
            {
                if (!bcmolt_epon_oam_ktleaf_attribute_pack(this->u.ktattribute.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_KTACTION:
            {
                if (!bcmolt_epon_oam_ktleaf_action_pack(this->u.ktaction.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.def.leaf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_var_descriptor_get_packed_length(bcmolt_epon_oam_ctc_var_descriptor *this)
{
    uint32_t count = 1;
    switch (this->branch)
    {
        case BCMOLT_EPON_OAM_CTC_BRANCH_END:
            {
                count += this->u.end.unknown_count;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_ATTRIBUTE:
            {
                count += 2;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_ACTION:
            {
                count += 2;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_OLD_MANAGEMENT_OBJECT:
            {
                count += bcmolt_epon_oam_ctc_old_management_object_base_get_packed_length(&this->u.old_management_object.value);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_MANAGEMENT_OBJECT:
            {
                count += bcmolt_epon_oam_ctc_management_object_base_get_packed_length(&this->u.management_object.value);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_EXT_ATTRIBUTE:
            {
                count += 2;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_EXT_ACTION:
            {
                count += 2;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_KTATTRIBUTE:
            {
                count += 2;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_KTACTION:
            {
                count += 2;
            }
            break;
        default:
            {
                count += 2;
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_var_descriptor_unpack(bcmolt_epon_oam_ctc_var_descriptor *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_ctc_branch_unpack(&this->branch, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->branch)
    {
        case BCMOLT_EPON_OAM_CTC_BRANCH_END:
            {
                this->u.end.unknown_count = bcmolt_epon_oam_ctc_var_descriptor_end_count_unknown(buf);
                if ((this->u.end.unknown_count > 0) && (this->u.end.unknown == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"unknown\" of struct \"bcmolt_epon_oam_ctc_var_descriptor_end\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.end.unknown = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.end.unknown_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.end.unknown, this->u.end.unknown_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_var_leaf_attribute_unpack(&this->u.attribute.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_ACTION:
            {
                if (!bcmolt_epon_oam_var_leaf_action_unpack(&this->u.action.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_OLD_MANAGEMENT_OBJECT:
            {
                if (!bcmolt_epon_oam_ctc_old_management_object_base_unpack(&this->u.old_management_object.value, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_MANAGEMENT_OBJECT:
            {
                if (!bcmolt_epon_oam_ctc_management_object_base_unpack(&this->u.management_object.value, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_EXT_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_ctc_leaf_ext_attribute_unpack(&this->u.ext_attribute.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_EXT_ACTION:
            {
                if (!bcmolt_epon_oam_ctc_leaf_ext_action_unpack(&this->u.ext_action.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_KTATTRIBUTE:
            {
                if (!bcmolt_epon_oam_ktleaf_attribute_unpack(&this->u.ktattribute.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_KTACTION:
            {
                if (!bcmolt_epon_oam_ktleaf_action_unpack(&this->u.ktaction.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.def.leaf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_var_descriptor_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_ctc_branch branch;
    if (!bcmolt_epon_oam_ctc_branch_unpack(&branch, packed))
    {
        return BCMOS_FALSE;
    }

    switch (branch)
    {
        case BCMOLT_EPON_OAM_CTC_BRANCH_END:
            {
                uint32_t unknown_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(packed, 1))
                    {
                        break;
                    }

                    unknown_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(unknown_elem_count * sizeof(uint8_t));
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_ACTION:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_OLD_MANAGEMENT_OBJECT:
            {
                if (!bcmolt_epon_oam_ctc_old_management_object_base_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_MANAGEMENT_OBJECT:
            {
                if (!bcmolt_epon_oam_ctc_management_object_base_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_EXT_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_EXT_ACTION:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_KTATTRIBUTE:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_KTACTION:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_var_descriptor_end_count_unknown(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ktonu_event_base_pack(bcmolt_epon_oam_ktonu_event_base *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t preLenFieldPos;
    uint32_t bytesAfterLenField;
    if (!bcmolt_epon_oam_ktonu_event_type_pack(this->type, buf))
    {
        return BCMOS_FALSE;
    }

    preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

    /* skip over length field (we'll fill it in later) */
    if (!bcmolt_epon_oam_buf_skip(buf, 1))
    {
        return BCMOS_FALSE;
    }

    switch (this->type)
    {
        case BCMOLT_EPON_OAM_KTONU_EVENT_TYPE_LOOP_DETECT:
            {
                if (!bcmolt_epon_oam_ktloop_detect_event_pack(this->u.loop_detect.event, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_KTONU_EVENT_TYPE_OPTICAL_POWER_ALARM:
            {
                if (!bcmolt_epon_oam_ktoptical_power_alarm_event_pack(this->u.optical_power_alarm.event, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_KTONU_EVENT_TYPE_END:
        default:
            {
            }
            break;
    }

    bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
    if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, bytesAfterLenField + 2))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ktonu_event_base_get_packed_length(bcmolt_epon_oam_ktonu_event_base *this)
{
    uint32_t count = 2;
    switch (this->type)
    {
        case BCMOLT_EPON_OAM_KTONU_EVENT_TYPE_LOOP_DETECT:
            {
                count += 1;
            }
            break;
        case BCMOLT_EPON_OAM_KTONU_EVENT_TYPE_OPTICAL_POWER_ALARM:
            {
                count += 1;
            }
            break;
        case BCMOLT_EPON_OAM_KTONU_EVENT_TYPE_END:
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ktonu_event_base_unpack(bcmolt_epon_oam_ktonu_event_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint8_t length = 0;
    bcmolt_epon_oam_buf postLenBuf;
    if (!bcmolt_epon_oam_ktonu_event_type_unpack(&this->type, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length - 2, buf->curr);
    switch (this->type)
    {
        case BCMOLT_EPON_OAM_KTONU_EVENT_TYPE_LOOP_DETECT:
            {
                if (!bcmolt_epon_oam_ktloop_detect_event_unpack(&this->u.loop_detect.event, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_KTONU_EVENT_TYPE_OPTICAL_POWER_ALARM:
            {
                if (!bcmolt_epon_oam_ktoptical_power_alarm_event_unpack(&this->u.optical_power_alarm.event, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_KTONU_EVENT_TYPE_END:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(buf, length - 2))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ktonu_event_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_ktonu_event_type type;
    bcmolt_epon_oam_buf postLenBuf;
    uint8_t length;
    if (!bcmolt_epon_oam_ktonu_event_type_unpack(&type, packed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length - 2, packed->curr);
    switch (type)
    {
        case BCMOLT_EPON_OAM_KTONU_EVENT_TYPE_LOOP_DETECT:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_KTONU_EVENT_TYPE_OPTICAL_POWER_ALARM:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_KTONU_EVENT_TYPE_END:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, length - 2))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_vendor_extended_base_pack(bcmolt_epon_oam_ctc_vendor_extended_base *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_ctc_opcode_pack(this->op, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->op)
    {
        case BCMOLT_EPON_OAM_CTC_OPCODE_GET_REQUEST:
            {
                uint32_t i0;
                if ((this->u.get_request.vars_count > 0) && (this->u.get_request.vars == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vars\" of struct \"bcmolt_epon_oam_ctc_vendor_extended_base_get_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i0 = 0; i0 < this->u.get_request.vars_count; i0++)
                {
                    if (!bcmolt_epon_oam_ctc_var_descriptor_pack(&this->u.get_request.vars[i0], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_OPCODE_GET_RESPONSE:
            {
                uint32_t i1;
                if ((this->u.get_response.vars_count > 0) && (this->u.get_response.vars == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vars\" of struct \"bcmolt_epon_oam_ctc_vendor_extended_base_get_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i1 = 0; i1 < this->u.get_response.vars_count; i1++)
                {
                    if (!bcmolt_epon_oam_ctc_var_container_base_pack(&this->u.get_response.vars[i1], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_OPCODE_SET_REQUEST:
            {
                uint32_t i2;
                if ((this->u.set_request.vars_count > 0) && (this->u.set_request.vars == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vars\" of struct \"bcmolt_epon_oam_ctc_vendor_extended_base_set_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i2 = 0; i2 < this->u.set_request.vars_count; i2++)
                {
                    if (!bcmolt_epon_oam_ctc_var_container_base_pack(&this->u.set_request.vars[i2], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_OPCODE_SET_RESPONSE:
            {
                uint32_t i3;
                if ((this->u.set_response.vars_count > 0) && (this->u.set_response.vars == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vars\" of struct \"bcmolt_epon_oam_ctc_vendor_extended_base_set_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i3 = 0; i3 < this->u.set_response.vars_count; i3++)
                {
                    if (!bcmolt_epon_oam_ctc_empty_var_container_base_pack(&this->u.set_response.vars[i3], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_OPCODE_SOFTWARE_DOWNLOAD:
            {
                uint32_t i4;
                if ((this->u.software_download.messages_count > 0) && (this->u.software_download.messages == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"messages\" of struct \"bcmolt_epon_oam_ctc_vendor_extended_base_software_download\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i4 = 0; i4 < this->u.software_download.messages_count; i4++)
                {
                    if (!bcmolt_epon_oam_ctc_software_download_prov_base_pack(&this->u.software_download.messages[i4], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_OPCODE_ONU_AUTHENTICATION:
            {
                if (!bcmolt_epon_oam_ctc_onu_auth_code_pack(this->u.onu_authentication.code, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.onu_authentication.authentication_data_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.onu_authentication.authentication_data_count > 0) && (this->u.onu_authentication.authentication_data == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"authentication_data\" of struct \"bcmolt_epon_oam_ctc_vendor_extended_base_onu_authentication\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.onu_authentication.authentication_data, this->u.onu_authentication.authentication_data_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_OPCODE_CHURNING:
            {
                if (!bcmolt_epon_oam_ctc_churning_prov_base_pack(&this->u.churning.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_OPCODE_DBA:
            {
                if (!bcmolt_epon_oam_ctc_dba_prov_base_pack(&this->u.dba.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_OPCODE_KTONU_EVENT:
            {
                uint32_t i5;
                if ((this->u.ktonu_event.events_count > 0) && (this->u.ktonu_event.events == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"events\" of struct \"bcmolt_epon_oam_ctc_vendor_extended_base_ktonu_event\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i5 = 0; i5 < this->u.ktonu_event.events_count; i5++)
                {
                    if (!bcmolt_epon_oam_ktonu_event_base_pack(&this->u.ktonu_event.events[i5], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_OPCODE_EVENT:
            {
                if (!bcmolt_epon_oam_ctc_event_base_pack(&this->u.event.events, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_vendor_extended_base_get_packed_length(bcmolt_epon_oam_ctc_vendor_extended_base *this)
{
    uint32_t count = 1;
    switch (this->op)
    {
        case BCMOLT_EPON_OAM_CTC_OPCODE_GET_REQUEST:
            {
                uint32_t i0;
                if ((this->u.get_request.vars_count > 0) && (this->u.get_request.vars == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vars_count\" of struct \"bcmolt_epon_oam_ctc_vendor_extended_base\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return 0;
                }

                for (i0 = 0; i0 < this->u.get_request.vars_count; i0++)
                {
                    count += bcmolt_epon_oam_ctc_var_descriptor_get_packed_length(&this->u.get_request.vars[i0]);
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_OPCODE_GET_RESPONSE:
            {
                uint32_t i1;
                if ((this->u.get_response.vars_count > 0) && (this->u.get_response.vars == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vars_count\" of struct \"bcmolt_epon_oam_ctc_vendor_extended_base\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return 0;
                }

                for (i1 = 0; i1 < this->u.get_response.vars_count; i1++)
                {
                    count += bcmolt_epon_oam_ctc_var_container_base_get_packed_length(&this->u.get_response.vars[i1]);
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_OPCODE_SET_REQUEST:
            {
                uint32_t i2;
                if ((this->u.set_request.vars_count > 0) && (this->u.set_request.vars == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vars_count\" of struct \"bcmolt_epon_oam_ctc_vendor_extended_base\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return 0;
                }

                for (i2 = 0; i2 < this->u.set_request.vars_count; i2++)
                {
                    count += bcmolt_epon_oam_ctc_var_container_base_get_packed_length(&this->u.set_request.vars[i2]);
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_OPCODE_SET_RESPONSE:
            {
                uint32_t i3;
                if ((this->u.set_response.vars_count > 0) && (this->u.set_response.vars == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vars_count\" of struct \"bcmolt_epon_oam_ctc_vendor_extended_base\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return 0;
                }

                for (i3 = 0; i3 < this->u.set_response.vars_count; i3++)
                {
                    count += bcmolt_epon_oam_ctc_empty_var_container_base_get_packed_length(&this->u.set_response.vars[i3]);
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_OPCODE_SOFTWARE_DOWNLOAD:
            {
                uint32_t i4;
                if ((this->u.software_download.messages_count > 0) && (this->u.software_download.messages == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"messages_count\" of struct \"bcmolt_epon_oam_ctc_vendor_extended_base\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return 0;
                }

                for (i4 = 0; i4 < this->u.software_download.messages_count; i4++)
                {
                    count += bcmolt_epon_oam_ctc_software_download_prov_base_get_packed_length(&this->u.software_download.messages[i4]);
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_OPCODE_ONU_AUTHENTICATION:
            {
                count += 3 + this->u.onu_authentication.authentication_data_count;
            }
            break;
        case BCMOLT_EPON_OAM_CTC_OPCODE_CHURNING:
            {
                count += bcmolt_epon_oam_ctc_churning_prov_base_get_packed_length(&this->u.churning.value);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_OPCODE_DBA:
            {
                count += bcmolt_epon_oam_ctc_dba_prov_base_get_packed_length(&this->u.dba.value);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_OPCODE_KTONU_EVENT:
            {
                uint32_t i5;
                if ((this->u.ktonu_event.events_count > 0) && (this->u.ktonu_event.events == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"events_count\" of struct \"bcmolt_epon_oam_ctc_vendor_extended_base\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return 0;
                }

                for (i5 = 0; i5 < this->u.ktonu_event.events_count; i5++)
                {
                    count += bcmolt_epon_oam_ktonu_event_base_get_packed_length(&this->u.ktonu_event.events[i5]);
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_OPCODE_EVENT:
            {
                count += bcmolt_epon_oam_ctc_event_base_get_packed_length(&this->u.event.events);
            }
            break;
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_vendor_extended_base_unpack(bcmolt_epon_oam_ctc_vendor_extended_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_ctc_opcode_unpack(&this->op, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->op)
    {
        case BCMOLT_EPON_OAM_CTC_OPCODE_GET_REQUEST:
            {
                uint32_t i0;
                this->u.get_request.vars_count = bcmolt_epon_oam_ctc_vendor_extended_base_get_request_count_vars(buf);
                if ((this->u.get_request.vars_count > 0) && (this->u.get_request.vars == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vars\" of struct \"bcmolt_epon_oam_ctc_vendor_extended_base_get_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.get_request.vars = (bcmolt_epon_oam_ctc_var_descriptor *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.get_request.vars_count * sizeof(bcmolt_epon_oam_ctc_var_descriptor));
                    }
                }

                for (i0 = 0; i0 < this->u.get_request.vars_count; i0++)
                {
                    if (!bcmolt_epon_oam_ctc_var_descriptor_unpack(&this->u.get_request.vars[i0], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_OPCODE_GET_RESPONSE:
            {
                uint32_t i1;
                this->u.get_response.vars_count = bcmolt_epon_oam_ctc_vendor_extended_base_get_response_count_vars(buf);
                if ((this->u.get_response.vars_count > 0) && (this->u.get_response.vars == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vars\" of struct \"bcmolt_epon_oam_ctc_vendor_extended_base_get_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.get_response.vars = (bcmolt_epon_oam_ctc_var_container_base *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.get_response.vars_count * sizeof(bcmolt_epon_oam_ctc_var_container_base));
                    }
                }

                for (i1 = 0; i1 < this->u.get_response.vars_count; i1++)
                {
                    if (!bcmolt_epon_oam_ctc_var_container_base_unpack(&this->u.get_response.vars[i1], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_OPCODE_SET_REQUEST:
            {
                uint32_t i2;
                this->u.set_request.vars_count = bcmolt_epon_oam_ctc_vendor_extended_base_set_request_count_vars(buf);
                if ((this->u.set_request.vars_count > 0) && (this->u.set_request.vars == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vars\" of struct \"bcmolt_epon_oam_ctc_vendor_extended_base_set_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.set_request.vars = (bcmolt_epon_oam_ctc_var_container_base *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.set_request.vars_count * sizeof(bcmolt_epon_oam_ctc_var_container_base));
                    }
                }

                for (i2 = 0; i2 < this->u.set_request.vars_count; i2++)
                {
                    if (!bcmolt_epon_oam_ctc_var_container_base_unpack(&this->u.set_request.vars[i2], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_OPCODE_SET_RESPONSE:
            {
                uint32_t i3;
                this->u.set_response.vars_count = bcmolt_epon_oam_ctc_vendor_extended_base_set_response_count_vars(buf);
                if ((this->u.set_response.vars_count > 0) && (this->u.set_response.vars == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vars\" of struct \"bcmolt_epon_oam_ctc_vendor_extended_base_set_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.set_response.vars = (bcmolt_epon_oam_ctc_empty_var_container_base *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.set_response.vars_count * sizeof(bcmolt_epon_oam_ctc_empty_var_container_base));
                    }
                }

                for (i3 = 0; i3 < this->u.set_response.vars_count; i3++)
                {
                    if (!bcmolt_epon_oam_ctc_empty_var_container_base_unpack(&this->u.set_response.vars[i3], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_OPCODE_SOFTWARE_DOWNLOAD:
            {
                uint32_t i4;
                this->u.software_download.messages_count = bcmolt_epon_oam_ctc_vendor_extended_base_software_download_count_messages(buf);
                if ((this->u.software_download.messages_count > 0) && (this->u.software_download.messages == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"messages\" of struct \"bcmolt_epon_oam_ctc_vendor_extended_base_software_download\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.software_download.messages = (bcmolt_epon_oam_ctc_software_download_prov_base *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.software_download.messages_count * sizeof(bcmolt_epon_oam_ctc_software_download_prov_base));
                    }
                }

                for (i4 = 0; i4 < this->u.software_download.messages_count; i4++)
                {
                    if (!bcmolt_epon_oam_ctc_software_download_prov_base_unpack(&this->u.software_download.messages[i4], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_OPCODE_ONU_AUTHENTICATION:
            {
                if (!bcmolt_epon_oam_ctc_onu_auth_code_unpack(&this->u.onu_authentication.code, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.onu_authentication.authentication_data_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.onu_authentication.authentication_data_count > 0) && (this->u.onu_authentication.authentication_data == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"authentication_data\" of struct \"bcmolt_epon_oam_ctc_vendor_extended_base_onu_authentication\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.onu_authentication.authentication_data = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.onu_authentication.authentication_data_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.onu_authentication.authentication_data, this->u.onu_authentication.authentication_data_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_OPCODE_CHURNING:
            {
                if (!bcmolt_epon_oam_ctc_churning_prov_base_unpack(&this->u.churning.value, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_OPCODE_DBA:
            {
                if (!bcmolt_epon_oam_ctc_dba_prov_base_unpack(&this->u.dba.value, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_OPCODE_KTONU_EVENT:
            {
                uint32_t i5;
                this->u.ktonu_event.events_count = bcmolt_epon_oam_ctc_vendor_extended_base_ktonu_event_count_events(buf);
                if ((this->u.ktonu_event.events_count > 0) && (this->u.ktonu_event.events == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"events\" of struct \"bcmolt_epon_oam_ctc_vendor_extended_base_ktonu_event\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.ktonu_event.events = (bcmolt_epon_oam_ktonu_event_base *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.ktonu_event.events_count * sizeof(bcmolt_epon_oam_ktonu_event_base));
                    }
                }

                for (i5 = 0; i5 < this->u.ktonu_event.events_count; i5++)
                {
                    if (!bcmolt_epon_oam_ktonu_event_base_unpack(&this->u.ktonu_event.events[i5], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_OPCODE_EVENT:
            {
                if (!bcmolt_epon_oam_ctc_event_base_unpack(&this->u.event.events, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ctc_vendor_extended_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_ctc_opcode op;
    if (!bcmolt_epon_oam_ctc_opcode_unpack(&op, packed))
    {
        return BCMOS_FALSE;
    }

    switch (op)
    {
        case BCMOLT_EPON_OAM_CTC_OPCODE_GET_REQUEST:
            {
                uint32_t vars_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_ctc_var_descriptor_scan(packed, extra_mem))
                    {
                        break;
                    }

                    vars_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(vars_elem_count * sizeof(bcmolt_epon_oam_ctc_var_descriptor));
            }
            break;
        case BCMOLT_EPON_OAM_CTC_OPCODE_GET_RESPONSE:
            {
                uint32_t vars_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_ctc_var_container_base_scan(packed, extra_mem))
                    {
                        break;
                    }

                    vars_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(vars_elem_count * sizeof(bcmolt_epon_oam_ctc_var_container_base));
            }
            break;
        case BCMOLT_EPON_OAM_CTC_OPCODE_SET_REQUEST:
            {
                uint32_t vars_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_ctc_var_container_base_scan(packed, extra_mem))
                    {
                        break;
                    }

                    vars_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(vars_elem_count * sizeof(bcmolt_epon_oam_ctc_var_container_base));
            }
            break;
        case BCMOLT_EPON_OAM_CTC_OPCODE_SET_RESPONSE:
            {
                uint32_t vars_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_ctc_empty_var_container_base_scan(packed, extra_mem))
                    {
                        break;
                    }

                    vars_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(vars_elem_count * sizeof(bcmolt_epon_oam_ctc_empty_var_container_base));
            }
            break;
        case BCMOLT_EPON_OAM_CTC_OPCODE_SOFTWARE_DOWNLOAD:
            {
                uint32_t messages_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_ctc_software_download_prov_base_scan(packed, extra_mem))
                    {
                        break;
                    }

                    messages_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(messages_elem_count * sizeof(bcmolt_epon_oam_ctc_software_download_prov_base));
            }
            break;
        case BCMOLT_EPON_OAM_CTC_OPCODE_ONU_AUTHENTICATION:
            {
                uint16_t authentication_data_count;
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(packed, &authentication_data_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * authentication_data_count);
                if (!bcmolt_epon_oam_buf_skip(packed, authentication_data_count * 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_OPCODE_CHURNING:
            {
                if (!bcmolt_epon_oam_ctc_churning_prov_base_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_OPCODE_DBA:
            {
                if (!bcmolt_epon_oam_ctc_dba_prov_base_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_OPCODE_KTONU_EVENT:
            {
                uint32_t events_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_ktonu_event_base_scan(packed, extra_mem))
                    {
                        break;
                    }

                    events_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(events_elem_count * sizeof(bcmolt_epon_oam_ktonu_event_base));
            }
            break;
        case BCMOLT_EPON_OAM_CTC_OPCODE_EVENT:
            {
                if (!bcmolt_epon_oam_ctc_event_base_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_vendor_extended_base_get_request_count_vars(bcmolt_epon_oam_buf *buf)
{
    uint32_t count = 0;
    uint32_t dummy = 0;
    bcmolt_epon_oam_buf bufClone = *buf;
    while (BCMOS_TRUE)
    {
        if (!bcmolt_epon_oam_ctc_var_descriptor_scan(&bufClone, &dummy))
        {
            break;
        }

        count += 1;
    }

    return count;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_vendor_extended_base_get_response_count_vars(bcmolt_epon_oam_buf *buf)
{
    uint32_t count = 0;
    uint32_t dummy = 0;
    bcmolt_epon_oam_buf bufClone = *buf;
    while (BCMOS_TRUE)
    {
        if (!bcmolt_epon_oam_ctc_var_container_base_scan(&bufClone, &dummy))
        {
            break;
        }

        count += 1;
    }

    return count;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_vendor_extended_base_set_request_count_vars(bcmolt_epon_oam_buf *buf)
{
    uint32_t count = 0;
    uint32_t dummy = 0;
    bcmolt_epon_oam_buf bufClone = *buf;
    while (BCMOS_TRUE)
    {
        if (!bcmolt_epon_oam_ctc_var_container_base_scan(&bufClone, &dummy))
        {
            break;
        }

        count += 1;
    }

    return count;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_vendor_extended_base_set_response_count_vars(bcmolt_epon_oam_buf *buf)
{
    uint32_t count = 0;
    uint32_t dummy = 0;
    bcmolt_epon_oam_buf bufClone = *buf;
    while (BCMOS_TRUE)
    {
        if (!bcmolt_epon_oam_ctc_empty_var_container_base_scan(&bufClone, &dummy))
        {
            break;
        }

        count += 1;
    }

    return count;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_vendor_extended_base_software_download_count_messages(bcmolt_epon_oam_buf *buf)
{
    uint32_t count = 0;
    uint32_t dummy = 0;
    bcmolt_epon_oam_buf bufClone = *buf;
    while (BCMOS_TRUE)
    {
        if (!bcmolt_epon_oam_ctc_software_download_prov_base_scan(&bufClone, &dummy))
        {
            break;
        }

        count += 1;
    }

    return count;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ctc_vendor_extended_base_ktonu_event_count_events(bcmolt_epon_oam_buf *buf)
{
    uint32_t count = 0;
    uint32_t dummy = 0;
    bcmolt_epon_oam_buf bufClone = *buf;
    while (BCMOS_TRUE)
    {
        if (!bcmolt_epon_oam_ktonu_event_base_scan(&bufClone, &dummy))
        {
            break;
        }

        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dasan_classifier_base_pack(bcmolt_epon_oam_dasan_classifier_base *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_dasan_classifier_command_pack(this->command, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_dasan_direction_pack(this->direction, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->command)
    {
        case BCMOLT_EPON_OAM_DASAN_CLASSIFIER_COMMAND_ADD_FILTER:
            {
                if (!bcmolt_epon_oam_dasan_filter_field_pack(this->u.add_filter.field, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.add_filter.value))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_dasan_filter_action_pack(this->u.add_filter.action, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_CLASSIFIER_COMMAND_REMOVE_FILTER:
            {
                if (!bcmolt_epon_oam_dasan_filter_field_pack(this->u.remove_filter.field, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.remove_filter.value))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_dasan_filter_action_pack(this->u.remove_filter.action, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_CLASSIFIER_COMMAND_QUEUE_MAP:
            {
                if (!bcmolt_epon_oam_dasan_pri_type_pack(this->u.queue_map.pri_type, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.queue_map.in_priority))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.queue_map.out_priority))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_CLASSIFIER_COMMAND_ADD_PRIORITY_FOR_VLAN:
            {
                if (!bcmolt_epon_oam_dasan_filter_field_pack(this->u.add_priority_for_vlan.field, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.add_priority_for_vlan.value))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.add_priority_for_vlan.pri_vlan))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.add_priority_for_vlan.pri_queue))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dasan_classifier_base_get_packed_length(bcmolt_epon_oam_dasan_classifier_base *this)
{
    uint32_t count = 6;
    switch (this->command)
    {
        case BCMOLT_EPON_OAM_DASAN_CLASSIFIER_COMMAND_ADD_FILTER:
            {
                count += 10;
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_CLASSIFIER_COMMAND_REMOVE_FILTER:
            {
                count += 10;
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_CLASSIFIER_COMMAND_QUEUE_MAP:
            {
                count += 6;
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_CLASSIFIER_COMMAND_ADD_PRIORITY_FOR_VLAN:
            {
                count += 8;
            }
            break;
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dasan_classifier_base_unpack(bcmolt_epon_oam_dasan_classifier_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_dasan_classifier_command_unpack(&this->command, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_dasan_direction_unpack(&this->direction, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->command)
    {
        case BCMOLT_EPON_OAM_DASAN_CLASSIFIER_COMMAND_ADD_FILTER:
            {
                if (!bcmolt_epon_oam_dasan_filter_field_unpack(&this->u.add_filter.field, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.add_filter.value))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_dasan_filter_action_unpack(&this->u.add_filter.action, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_CLASSIFIER_COMMAND_REMOVE_FILTER:
            {
                if (!bcmolt_epon_oam_dasan_filter_field_unpack(&this->u.remove_filter.field, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.remove_filter.value))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_dasan_filter_action_unpack(&this->u.remove_filter.action, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_CLASSIFIER_COMMAND_QUEUE_MAP:
            {
                if (!bcmolt_epon_oam_dasan_pri_type_unpack(&this->u.queue_map.pri_type, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.queue_map.in_priority))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.queue_map.out_priority))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_CLASSIFIER_COMMAND_ADD_PRIORITY_FOR_VLAN:
            {
                if (!bcmolt_epon_oam_dasan_filter_field_unpack(&this->u.add_priority_for_vlan.field, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.add_priority_for_vlan.value))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.add_priority_for_vlan.pri_vlan))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.add_priority_for_vlan.pri_queue))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dasan_classifier_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_dasan_classifier_command command;
    if (!bcmolt_epon_oam_dasan_classifier_command_unpack(&command, packed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    switch (command)
    {
        case BCMOLT_EPON_OAM_DASAN_CLASSIFIER_COMMAND_ADD_FILTER:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_CLASSIFIER_COMMAND_REMOVE_FILTER:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_CLASSIFIER_COMMAND_QUEUE_MAP:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_CLASSIFIER_COMMAND_ADD_PRIORITY_FOR_VLAN:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dasan_port_pack(bcmolt_epon_oam_dasan_port *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u16(buf, this->port_number))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_bool(buf, this->enabled))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_bool(buf, this->auto_negotiation_enabled))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->speed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->reserved))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_bool(buf, this->is_full_duplex))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->learning_table_size))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dasan_port_unpack(bcmolt_epon_oam_dasan_port *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->port_number))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_bool(buf, &this->enabled))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_bool(buf, &this->auto_negotiation_enabled))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->speed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->reserved))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_bool(buf, &this->is_full_duplex))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->learning_table_size))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dasan_port_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 10);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dasan_vlan_pack(bcmolt_epon_oam_dasan_vlan *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u8(buf, this->reserved))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_bool(buf, this->is_tagged))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->vlan_id))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dasan_vlan_unpack(bcmolt_epon_oam_dasan_vlan *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->reserved))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_bool(buf, &this->is_tagged))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->vlan_id))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dasan_vlan_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 4);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dasan_vlan_port_pack(bcmolt_epon_oam_dasan_vlan_port *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t i0;
    if (!bcmolt_epon_oam_buf_write_u16(buf, this->port_number))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->vlans_count))
    {
        return BCMOS_FALSE;
    }

    if ((this->vlans_count > 0) && (this->vlans == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vlans\" of struct \"bcmolt_epon_oam_dasan_vlan_port\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->vlans_count; i0++)
    {
        if (!bcmolt_epon_oam_dasan_vlan_pack(&this->vlans[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->pvid))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dasan_vlan_port_get_packed_length(bcmolt_epon_oam_dasan_vlan_port *this)
{
    return 6 + (4 * this->vlans_count);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dasan_vlan_port_unpack(bcmolt_epon_oam_dasan_vlan_port *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint16_t i0;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->port_number))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->vlans_count))
    {
        return BCMOS_FALSE;
    }

    if ((this->vlans_count > 0) && (this->vlans == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vlans\" of struct \"bcmolt_epon_oam_dasan_vlan_port\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->vlans = (bcmolt_epon_oam_dasan_vlan *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->vlans_count * sizeof(bcmolt_epon_oam_dasan_vlan));
        }
    }

    for (i0 = 0; i0 < this->vlans_count; i0++)
    {
        if (!bcmolt_epon_oam_dasan_vlan_unpack(&this->vlans[i0], buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->pvid))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dasan_vlan_port_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    uint16_t vlans_count;
    if (!bcmolt_epon_oam_buf_skip(packed, 2))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(packed, &vlans_count))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_dasan_vlan) * vlans_count);
    if (!bcmolt_epon_oam_buf_skip(packed, vlans_count * 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 2))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dasan_port_config_pack(bcmolt_epon_oam_dasan_port_config *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u8(buf, this->port_number))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_bool(buf, this->is_linked))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->speed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_bool(buf, this->is_full_duplex))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dasan_port_config_unpack(bcmolt_epon_oam_dasan_port_config *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->port_number))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_bool(buf, &this->is_linked))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->speed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_bool(buf, &this->is_full_duplex))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dasan_port_config_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 4);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dasan_port_stats_pack(bcmolt_epon_oam_dasan_port_stats *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u64(buf, this->in_good_octets))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->in_good_frames))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->in_broadcast))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->in_multicast))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->out_good_octets))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->out_good_frames))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->out_broadcast))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->out_multicast))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dasan_port_stats_unpack(bcmolt_epon_oam_dasan_port_stats *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->in_good_octets))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->in_good_frames))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->in_broadcast))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->in_multicast))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->out_good_octets))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->out_good_frames))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->out_broadcast))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->out_multicast))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dasan_port_stats_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 40);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dasan_port_error_stats_pack(bcmolt_epon_oam_dasan_port_error_stats *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u32(buf, this->undersized))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->oversized))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->jabber))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->in_mac_receive_error))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->in_fcs_error))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dasan_port_error_stats_unpack(bcmolt_epon_oam_dasan_port_error_stats *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->undersized))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->oversized))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->jabber))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->in_mac_receive_error))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->in_fcs_error))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dasan_port_error_stats_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 20);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dasan_stats_seq_base_pack(bcmolt_epon_oam_dasan_stats_seq_base *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_dasan_stats_seq_type_pack(this->type, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->type)
    {
        case BCMOLT_EPON_OAM_DASAN_STATS_SEQ_TYPE_PORT0AND1:
            {
                if (!bcmolt_epon_oam_dasan_port_stats_pack(&this->u.port0and1.port0, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_dasan_port_stats_pack(&this->u.port0and1.port1, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_STATS_SEQ_TYPE_PORT2AND3:
            {
                if (!bcmolt_epon_oam_dasan_port_stats_pack(&this->u.port2and3.port2, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_dasan_port_stats_pack(&this->u.port2and3.port3, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_STATS_SEQ_TYPE_ERRORS:
            {
                if (!bcmolt_epon_oam_dasan_port_error_stats_pack(&this->u.errors.port0, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_dasan_port_error_stats_pack(&this->u.errors.port1, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_dasan_port_error_stats_pack(&this->u.errors.port2, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_dasan_port_error_stats_pack(&this->u.errors.port3, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dasan_stats_seq_base_get_packed_length(bcmolt_epon_oam_dasan_stats_seq_base *this)
{
    uint32_t count = 1;
    switch (this->type)
    {
        case BCMOLT_EPON_OAM_DASAN_STATS_SEQ_TYPE_PORT0AND1:
            {
                count += 80;
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_STATS_SEQ_TYPE_PORT2AND3:
            {
                count += 80;
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_STATS_SEQ_TYPE_ERRORS:
            {
                count += 80;
            }
            break;
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dasan_stats_seq_base_unpack(bcmolt_epon_oam_dasan_stats_seq_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_dasan_stats_seq_type_unpack(&this->type, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->type)
    {
        case BCMOLT_EPON_OAM_DASAN_STATS_SEQ_TYPE_PORT0AND1:
            {
                if (!bcmolt_epon_oam_dasan_port_stats_unpack(&this->u.port0and1.port0, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_dasan_port_stats_unpack(&this->u.port0and1.port1, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_STATS_SEQ_TYPE_PORT2AND3:
            {
                if (!bcmolt_epon_oam_dasan_port_stats_unpack(&this->u.port2and3.port2, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_dasan_port_stats_unpack(&this->u.port2and3.port3, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_STATS_SEQ_TYPE_ERRORS:
            {
                if (!bcmolt_epon_oam_dasan_port_error_stats_unpack(&this->u.errors.port0, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_dasan_port_error_stats_unpack(&this->u.errors.port1, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_dasan_port_error_stats_unpack(&this->u.errors.port2, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_dasan_port_error_stats_unpack(&this->u.errors.port3, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dasan_stats_seq_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_dasan_stats_seq_type type;
    if (!bcmolt_epon_oam_dasan_stats_seq_type_unpack(&type, packed))
    {
        return BCMOS_FALSE;
    }

    switch (type)
    {
        case BCMOLT_EPON_OAM_DASAN_STATS_SEQ_TYPE_PORT0AND1:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 40))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 40))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_STATS_SEQ_TYPE_PORT2AND3:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 40))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 40))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_STATS_SEQ_TYPE_ERRORS:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 20))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 20))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 20))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 20))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dasan_stat_value_pack(bcmolt_epon_oam_dasan_stat_value *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_dasan_stat_id_pack(this->id, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->value))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dasan_stat_value_unpack(bcmolt_epon_oam_dasan_stat_value *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_dasan_stat_id_unpack(&this->id, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->value))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dasan_stat_value_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 6);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dasan_config_base_pack(bcmolt_epon_oam_dasan_config_base *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_dasan_opcode_pack(this->opcode, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->opcode)
    {
        case BCMOLT_EPON_OAM_DASAN_OPCODE_PORT_CONFIG:
            {
                uint16_t i0;
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.port_config.ports_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.port_config.ports_count > 0) && (this->u.port_config.ports == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"ports\" of struct \"bcmolt_epon_oam_dasan_config_base_port_config\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i0 = 0; i0 < this->u.port_config.ports_count; i0++)
                {
                    if (!bcmolt_epon_oam_dasan_port_pack(&this->u.port_config.ports[i0], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_SET_VLAN:
            {
                uint16_t i1;
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.set_vlan.ports_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.set_vlan.ports_count > 0) && (this->u.set_vlan.ports == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"ports\" of struct \"bcmolt_epon_oam_dasan_config_base_set_vlan\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i1 = 0; i1 < this->u.set_vlan.ports_count; i1++)
                {
                    if (!bcmolt_epon_oam_dasan_vlan_port_pack(&this->u.set_vlan.ports[i1], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_GET_ONU_CONFIG:
            {
                uint8_t i2;
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.get_onu_config.llid))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.get_onu_config.op))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.get_onu_config.profile_op))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.get_onu_config.value_size))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.get_onu_config.ports_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_onu_config.ports_count > 0) && (this->u.get_onu_config.ports == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"ports\" of struct \"bcmolt_epon_oam_dasan_config_base_get_onu_config\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i2 = 0; i2 < this->u.get_onu_config.ports_count; i2++)
                {
                    if (!bcmolt_epon_oam_dasan_port_config_pack(&this->u.get_onu_config.ports[i2], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_SET_STP:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.set_stp.reserved))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.set_stp.enable))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.set_stp.max_age))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.set_stp.forward_delay))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.set_stp.hello_time))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_SET_TXPOWER_OFF:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.set_txpower_off.enable_time))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_SET_LOOP_DETECT:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.set_loop_detect.llid_bitmap))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.set_loop_detect.enable))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.set_loop_detect.block_cap))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.set_loop_detect.send_cap))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.set_loop_detect.olt_mac_cap))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.set_loop_detect.send_period))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.set_loop_detect.block_time))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_mac_address(buf, this->u.set_loop_detect.olt_mac))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_SET_LOOP_DETECT_UNBLOCK:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.set_loop_detect_unblock.llid_bitmap))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_CLASSIFIER:
            {
                if (!bcmolt_epon_oam_dasan_classifier_base_pack(&this->u.classifier.classifier, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_ONU_VERSION:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.onu_version.llid))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.onu_version.op))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.onu_version.info_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.onu_version.info_count > 0) && (this->u.onu_version.info == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"info\" of struct \"bcmolt_epon_oam_dasan_config_base_onu_version\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.onu_version.info, this->u.onu_version.info_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_ONU_FLASH_FIRMWARE_VERSION:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.onu_flash_firmware_version.llid))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_flash_firmware_version.boot_mode))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_flash_firmware_version.active))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.onu_flash_firmware_version.image1string, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.onu_flash_firmware_version.image2string, 16))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_ONU_ACTIVE_IMAGE_TIME:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.onu_active_image_time.llid))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_active_image_time.active))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_active_image_time.build_time))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_ONU_STATISTIC:
            {
                uint32_t i3;
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.onu_statistic.llid))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.onu_statistic.op))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.onu_statistic.sequences_count > 0) && (this->u.onu_statistic.sequences == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"sequences\" of struct \"bcmolt_epon_oam_dasan_config_base_onu_statistic\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i3 = 0; i3 < this->u.onu_statistic.sequences_count; i3++)
                {
                    if (!bcmolt_epon_oam_dasan_stats_seq_base_pack(&this->u.onu_statistic.sequences[i3], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_ONU_STATISTIC_CLEAR:
            {
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_ONU_STATISTIC_GET:
            {
                uint8_t i4;
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.onu_statistic_get.llid_bitmap))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_statistic_get.statistics_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.onu_statistic_get.statistics_count > 0) && (this->u.onu_statistic_get.statistics == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"statistics\" of struct \"bcmolt_epon_oam_dasan_config_base_onu_statistic_get\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i4 = 0; i4 < this->u.onu_statistic_get.statistics_count; i4++)
                {
                    if (!bcmolt_epon_oam_dasan_stat_value_pack(&this->u.onu_statistic_get.statistics[i4], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_ONU_IGMP_SET:
            {
                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.onu_igmp_set.enable))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_igmp_set.max_groups))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_ONU_PORT_IGMP_FILTER:
            {
                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.onu_port_igmp_filter.enable))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_ONU_SHAPING:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_shaping.reserved))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.onu_shaping.enable))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.onu_shaping.rate))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dasan_config_base_get_packed_length(bcmolt_epon_oam_dasan_config_base *this)
{
    uint32_t count = 2;
    switch (this->opcode)
    {
        case BCMOLT_EPON_OAM_DASAN_OPCODE_PORT_CONFIG:
            {
                count += 2 + (10 * this->u.port_config.ports_count);
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_SET_VLAN:
            {
                uint32_t i0;
                count += 2;
                if ((this->u.set_vlan.ports_count > 0) && (this->u.set_vlan.ports == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"ports_count\" of struct \"bcmolt_epon_oam_dasan_config_base\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return 0;
                }

                for (i0 = 0; i0 < this->u.set_vlan.ports_count; i0++)
                {
                    count += bcmolt_epon_oam_dasan_vlan_port_get_packed_length(&this->u.set_vlan.ports[i0]);
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_GET_ONU_CONFIG:
            {
                count += 15 + (4 * this->u.get_onu_config.ports_count);
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_SET_STP:
            {
                count += 8;
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_SET_TXPOWER_OFF:
            {
                count += 2;
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_SET_LOOP_DETECT:
            {
                count += 26;
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_SET_LOOP_DETECT_UNBLOCK:
            {
                count += 8;
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_CLASSIFIER:
            {
                count += bcmolt_epon_oam_dasan_classifier_base_get_packed_length(&this->u.classifier.classifier);
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_ONU_VERSION:
            {
                count += 8 + this->u.onu_version.info_count;
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_ONU_FLASH_FIRMWARE_VERSION:
            {
                count += 36;
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_ONU_ACTIVE_IMAGE_TIME:
            {
                count += 11;
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_ONU_STATISTIC:
            {
                uint32_t i1;
                count += 10;
                if ((this->u.onu_statistic.sequences_count > 0) && (this->u.onu_statistic.sequences == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"sequences_count\" of struct \"bcmolt_epon_oam_dasan_config_base\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return 0;
                }

                for (i1 = 0; i1 < this->u.onu_statistic.sequences_count; i1++)
                {
                    count += bcmolt_epon_oam_dasan_stats_seq_base_get_packed_length(&this->u.onu_statistic.sequences[i1]);
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_ONU_STATISTIC_CLEAR:
            {
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_ONU_STATISTIC_GET:
            {
                count += 3 + (6 * this->u.onu_statistic_get.statistics_count);
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_ONU_IGMP_SET:
            {
                count += 2;
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_ONU_PORT_IGMP_FILTER:
            {
                count += 1;
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_ONU_SHAPING:
            {
                count += 6;
            }
            break;
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dasan_config_base_unpack(bcmolt_epon_oam_dasan_config_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_dasan_opcode_unpack(&this->opcode, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->opcode)
    {
        case BCMOLT_EPON_OAM_DASAN_OPCODE_PORT_CONFIG:
            {
                uint16_t i0;
                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.port_config.ports_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.port_config.ports_count > 0) && (this->u.port_config.ports == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"ports\" of struct \"bcmolt_epon_oam_dasan_config_base_port_config\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.port_config.ports = (bcmolt_epon_oam_dasan_port *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.port_config.ports_count * sizeof(bcmolt_epon_oam_dasan_port));
                    }
                }

                for (i0 = 0; i0 < this->u.port_config.ports_count; i0++)
                {
                    if (!bcmolt_epon_oam_dasan_port_unpack(&this->u.port_config.ports[i0], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_SET_VLAN:
            {
                uint16_t i1;
                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.set_vlan.ports_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.set_vlan.ports_count > 0) && (this->u.set_vlan.ports == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"ports\" of struct \"bcmolt_epon_oam_dasan_config_base_set_vlan\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.set_vlan.ports = (bcmolt_epon_oam_dasan_vlan_port *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.set_vlan.ports_count * sizeof(bcmolt_epon_oam_dasan_vlan_port));
                    }
                }

                for (i1 = 0; i1 < this->u.set_vlan.ports_count; i1++)
                {
                    if (!bcmolt_epon_oam_dasan_vlan_port_unpack(&this->u.set_vlan.ports[i1], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_GET_ONU_CONFIG:
            {
                uint8_t i2;
                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.get_onu_config.llid))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(buf, &this->u.get_onu_config.op))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.get_onu_config.profile_op))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.get_onu_config.value_size))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.get_onu_config.ports_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_onu_config.ports_count > 0) && (this->u.get_onu_config.ports == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"ports\" of struct \"bcmolt_epon_oam_dasan_config_base_get_onu_config\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.get_onu_config.ports = (bcmolt_epon_oam_dasan_port_config *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.get_onu_config.ports_count * sizeof(bcmolt_epon_oam_dasan_port_config));
                    }
                }

                for (i2 = 0; i2 < this->u.get_onu_config.ports_count; i2++)
                {
                    if (!bcmolt_epon_oam_dasan_port_config_unpack(&this->u.get_onu_config.ports[i2], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_SET_STP:
            {
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.set_stp.reserved))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_bool(buf, &this->u.set_stp.enable))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.set_stp.max_age))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.set_stp.forward_delay))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.set_stp.hello_time))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_SET_TXPOWER_OFF:
            {
                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.set_txpower_off.enable_time))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_SET_LOOP_DETECT:
            {
                if (!bcmolt_epon_oam_buf_read_u64(buf, &this->u.set_loop_detect.llid_bitmap))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_bool(buf, &this->u.set_loop_detect.enable))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.set_loop_detect.block_cap))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.set_loop_detect.send_cap))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.set_loop_detect.olt_mac_cap))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(buf, &this->u.set_loop_detect.send_period))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(buf, &this->u.set_loop_detect.block_time))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_mac_address(buf, &this->u.set_loop_detect.olt_mac))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_SET_LOOP_DETECT_UNBLOCK:
            {
                if (!bcmolt_epon_oam_buf_read_u64(buf, &this->u.set_loop_detect_unblock.llid_bitmap))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_CLASSIFIER:
            {
                if (!bcmolt_epon_oam_dasan_classifier_base_unpack(&this->u.classifier.classifier, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_ONU_VERSION:
            {
                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.onu_version.llid))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(buf, &this->u.onu_version.op))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.onu_version.info_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.onu_version.info_count > 0) && (this->u.onu_version.info == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"info\" of struct \"bcmolt_epon_oam_dasan_config_base_onu_version\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.onu_version.info = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.onu_version.info_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.onu_version.info, this->u.onu_version.info_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_ONU_FLASH_FIRMWARE_VERSION:
            {
                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.onu_flash_firmware_version.llid))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.onu_flash_firmware_version.boot_mode))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.onu_flash_firmware_version.active))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.onu_flash_firmware_version.image1string, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.onu_flash_firmware_version.image2string, 16))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_ONU_ACTIVE_IMAGE_TIME:
            {
                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.onu_active_image_time.llid))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.onu_active_image_time.active))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(buf, &this->u.onu_active_image_time.build_time))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_ONU_STATISTIC:
            {
                uint32_t i3;
                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.onu_statistic.llid))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u64(buf, &this->u.onu_statistic.op))
                {
                    return BCMOS_FALSE;
                }

                this->u.onu_statistic.sequences_count = bcmolt_epon_oam_dasan_config_base_onu_statistic_count_sequences(buf);
                if ((this->u.onu_statistic.sequences_count > 0) && (this->u.onu_statistic.sequences == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"sequences\" of struct \"bcmolt_epon_oam_dasan_config_base_onu_statistic\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.onu_statistic.sequences = (bcmolt_epon_oam_dasan_stats_seq_base *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.onu_statistic.sequences_count * sizeof(bcmolt_epon_oam_dasan_stats_seq_base));
                    }
                }

                for (i3 = 0; i3 < this->u.onu_statistic.sequences_count; i3++)
                {
                    if (!bcmolt_epon_oam_dasan_stats_seq_base_unpack(&this->u.onu_statistic.sequences[i3], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_ONU_STATISTIC_CLEAR:
            {
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_ONU_STATISTIC_GET:
            {
                uint8_t i4;
                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.onu_statistic_get.llid_bitmap))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.onu_statistic_get.statistics_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.onu_statistic_get.statistics_count > 0) && (this->u.onu_statistic_get.statistics == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"statistics\" of struct \"bcmolt_epon_oam_dasan_config_base_onu_statistic_get\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.onu_statistic_get.statistics = (bcmolt_epon_oam_dasan_stat_value *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.onu_statistic_get.statistics_count * sizeof(bcmolt_epon_oam_dasan_stat_value));
                    }
                }

                for (i4 = 0; i4 < this->u.onu_statistic_get.statistics_count; i4++)
                {
                    if (!bcmolt_epon_oam_dasan_stat_value_unpack(&this->u.onu_statistic_get.statistics[i4], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_ONU_IGMP_SET:
            {
                if (!bcmolt_epon_oam_buf_read_bool(buf, &this->u.onu_igmp_set.enable))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.onu_igmp_set.max_groups))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_ONU_PORT_IGMP_FILTER:
            {
                if (!bcmolt_epon_oam_buf_read_bool(buf, &this->u.onu_port_igmp_filter.enable))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_ONU_SHAPING:
            {
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.onu_shaping.reserved))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_bool(buf, &this->u.onu_shaping.enable))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(buf, &this->u.onu_shaping.rate))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dasan_config_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_dasan_opcode opcode;
    if (!bcmolt_epon_oam_dasan_opcode_unpack(&opcode, packed))
    {
        return BCMOS_FALSE;
    }

    switch (opcode)
    {
        case BCMOLT_EPON_OAM_DASAN_OPCODE_PORT_CONFIG:
            {
                uint16_t ports_count;
                if (!bcmolt_epon_oam_buf_read_u16(packed, &ports_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_dasan_port) * ports_count);
                if (!bcmolt_epon_oam_buf_skip(packed, ports_count * 10))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_SET_VLAN:
            {
                uint16_t ports_count;
                uint16_t i0;
                if (!bcmolt_epon_oam_buf_read_u16(packed, &ports_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_dasan_vlan_port) * ports_count);
                for (i0 = 0; i0 < ports_count; i0++)
                {
                    if (!bcmolt_epon_oam_dasan_vlan_port_scan(packed, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_GET_ONU_CONFIG:
            {
                uint8_t ports_count;
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(packed, &ports_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_dasan_port_config) * ports_count);
                if (!bcmolt_epon_oam_buf_skip(packed, ports_count * 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_SET_STP:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_SET_TXPOWER_OFF:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_SET_LOOP_DETECT:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 6))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_SET_LOOP_DETECT_UNBLOCK:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_CLASSIFIER:
            {
                if (!bcmolt_epon_oam_dasan_classifier_base_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_ONU_VERSION:
            {
                uint16_t info_count;
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(packed, &info_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * info_count);
                if (!bcmolt_epon_oam_buf_skip(packed, info_count * 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_ONU_FLASH_FIRMWARE_VERSION:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 16))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_ONU_ACTIVE_IMAGE_TIME:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_ONU_STATISTIC:
            {
                uint32_t sequences_elem_count = 0;
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 8))
                {
                    return BCMOS_FALSE;
                }

                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_dasan_stats_seq_base_scan(packed, extra_mem))
                    {
                        break;
                    }

                    sequences_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sequences_elem_count * sizeof(bcmolt_epon_oam_dasan_stats_seq_base));
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_ONU_STATISTIC_CLEAR:
            {
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_ONU_STATISTIC_GET:
            {
                uint8_t statistics_count;
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(packed, &statistics_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_dasan_stat_value) * statistics_count);
                if (!bcmolt_epon_oam_buf_skip(packed, statistics_count * 6))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_ONU_IGMP_SET:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_ONU_PORT_IGMP_FILTER:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DASAN_OPCODE_ONU_SHAPING:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dasan_config_base_onu_statistic_count_sequences(bcmolt_epon_oam_buf *buf)
{
    uint32_t count = 0;
    uint32_t dummy = 0;
    bcmolt_epon_oam_buf bufClone = *buf;
    while (BCMOS_TRUE)
    {
        if (!bcmolt_epon_oam_dasan_stats_seq_base_scan(&bufClone, &dummy))
        {
            break;
        }

        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_distinguished_name_pack(bcmolt_epon_oam_distinguished_name *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u8(buf, this->length))
    {
        return BCMOS_FALSE;
    }

    if ((this->length > 0) && (this->name == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"name\" of struct \"bcmolt_epon_oam_distinguished_name\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write(buf, this->name, this->length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_distinguished_name_get_packed_length(bcmolt_epon_oam_distinguished_name *this)
{
    return 1 + this->length;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_distinguished_name_unpack(bcmolt_epon_oam_distinguished_name *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->length))
    {
        return BCMOS_FALSE;
    }

    if ((this->length > 0) && (this->name == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"name\" of struct \"bcmolt_epon_oam_distinguished_name\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->name = (uint8_t *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->length * sizeof(uint8_t));
        }
    }

    if (!bcmolt_epon_oam_buf_read(buf, this->name, this->length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_distinguished_name_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    uint8_t length;
    if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * length);
    if (!bcmolt_epon_oam_buf_skip(packed, length * 1))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_distinguished_name_list_pack(bcmolt_epon_oam_distinguished_name_list *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t preLenFieldPos;
    uint32_t bytesAfterLenField;
    uint32_t i0;
    preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

    /* skip over length field (we'll fill it in later) */
    if (!bcmolt_epon_oam_buf_skip(buf, 2))
    {
        return BCMOS_FALSE;
    }

    if ((this->names_count > 0) && (this->names == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"names\" of struct \"bcmolt_epon_oam_distinguished_name_list\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    if (this->names_count > 65535L)
    {
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->names_count; i0++)
    {
        if (!bcmolt_epon_oam_distinguished_name_pack(&this->names[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint16_t));
    if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, bytesAfterLenField))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint16_t))))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_distinguished_name_list_get_packed_length(bcmolt_epon_oam_distinguished_name_list *this)
{
    uint32_t count = 2;
    uint32_t i0;
    if ((this->names_count > 0) && (this->names == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"names_count\" of struct \"bcmolt_epon_oam_distinguished_name_list\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return 0;
    }

    for (i0 = 0; i0 < this->names_count; i0++)
    {
        count += bcmolt_epon_oam_distinguished_name_get_packed_length(&this->names[i0]);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_distinguished_name_list_unpack(bcmolt_epon_oam_distinguished_name_list *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint16_t length = 0;
    bcmolt_epon_oam_buf postLenBuf;
    uint32_t i0;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, buf->curr);
    this->names_count = bcmolt_epon_oam_distinguished_name_list_count_names(&postLenBuf);
    if ((this->names_count > 0) && (this->names == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"names\" of struct \"bcmolt_epon_oam_distinguished_name_list\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->names = (bcmolt_epon_oam_distinguished_name *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->names_count * sizeof(bcmolt_epon_oam_distinguished_name));
        }
    }

    if (this->names_count > 65535L)
    {
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->names_count; i0++)
    {
        if (!bcmolt_epon_oam_distinguished_name_unpack(&this->names[i0], &postLenBuf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if (!bcmolt_epon_oam_buf_skip(buf, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_distinguished_name_list_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_buf postLenBuf;
    uint16_t length;
    uint32_t names_elem_count = 0;
    if (!bcmolt_epon_oam_buf_read_u16(packed, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, packed->curr);
    while (BCMOS_TRUE)
    {
        if (!bcmolt_epon_oam_distinguished_name_scan(&postLenBuf, extra_mem))
        {
            break;
        }

        names_elem_count += 1;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(names_elem_count * sizeof(bcmolt_epon_oam_distinguished_name));
    if (!bcmolt_epon_oam_buf_skip(packed, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_distinguished_name_list_count_names(bcmolt_epon_oam_buf *buf)
{
    uint32_t count = 0;
    uint32_t dummy = 0;
    bcmolt_epon_oam_buf bufClone = *buf;
    while (BCMOS_TRUE)
    {
        if (!bcmolt_epon_oam_distinguished_name_scan(&bufClone, &dummy))
        {
            break;
        }

        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_mac_table_pack(bcmolt_epon_oam_dpoe_mac_table *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t i0;
    if ((this->mac_address_count > 0) && (this->mac_address == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"mac_address\" of struct \"bcmolt_epon_oam_dpoe_mac_table\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->mac_address_count; i0++)
    {
        if (!bcmolt_epon_oam_buf_write_mac_address(buf, this->mac_address[i0]))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dpoe_mac_table_get_packed_length(bcmolt_epon_oam_dpoe_mac_table *this)
{
    return (6 * this->mac_address_count);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_mac_table_unpack(bcmolt_epon_oam_dpoe_mac_table *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint32_t i0;
    this->mac_address_count = bcmolt_epon_oam_dpoe_mac_table_count_mac_address(buf);
    if ((this->mac_address_count > 0) && (this->mac_address == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"mac_address\" of struct \"bcmolt_epon_oam_dpoe_mac_table\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->mac_address = (bcmos_mac_address *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->mac_address_count * sizeof(bcmos_mac_address));
        }
    }

    for (i0 = 0; i0 < this->mac_address_count; i0++)
    {
        if (!bcmolt_epon_oam_buf_read_mac_address(buf, &this->mac_address[i0]))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_mac_table_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    uint32_t mac_address_elem_count = 0;
    while (BCMOS_TRUE)
    {
        if (!bcmolt_epon_oam_buf_skip(packed, 6))
        {
            break;
        }

        mac_address_elem_count += 1;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(mac_address_elem_count * sizeof(bcmos_mac_address));
    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dpoe_mac_table_count_mac_address(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 6);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_action_value_base_pack(bcmolt_epon_oam_dpoe_action_value_base *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t preLenFieldPos;
    uint32_t bytesAfterLenField;
    if (!bcmolt_epon_oam_dpoe_leaf_action_pack(this->leaf, buf))
    {
        return BCMOS_FALSE;
    }

    if (this->width >= 0x0080)
    {
        bcmolt_epon_oam_buf_write_u8(buf, this->width);
        return BCMOS_TRUE;
    }

    preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

    /* skip over length field (we'll fill it in later) */
    if (!bcmolt_epon_oam_buf_skip(buf, 1))
    {
        return BCMOS_FALSE;
    }

    switch (this->leaf)
    {
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_RESET_ONU:
            {
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_ADD_DYN_MAC_ADDR:
            {
                if (!bcmolt_epon_oam_dpoe_mac_table_pack(&this->u.add_dyn_mac_addr.mac_addess, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_DEL_DYN_MAC_ADDR:
            {
                if (!bcmolt_epon_oam_dpoe_mac_table_pack(&this->u.del_dyn_mac_addr.mac_address, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_ADD_STATIC_MAC_ADDR:
            {
                if (!bcmolt_epon_oam_dpoe_mac_table_pack(&this->u.add_static_mac_addr.mac_address, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_DEL_STATIC_MAC_ADDR:
            {
                if (!bcmolt_epon_oam_dpoe_mac_table_pack(&this->u.del_static_mac_addr.mac_address, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_LOOPBACK_ENABLE:
            {
                if (!bcmolt_epon_oam_dpoe_loopback_location_pack(this->u.loopback_enable.location, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_LOOPBACK_DISABLE:
            {
                if (!bcmolt_epon_oam_dpoe_loopback_location_pack(this->u.loopback_disable.location, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_LASER_TX_POWER_OFF:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.laser_tx_power_off.disable_time))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_CLEAR_INGRESS_RULES:
            {
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_ADD_INGRESS_RULES:
            {
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_DEL_INGRESS_RULES:
            {
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_ENABLE_USER_TRAFFIC:
            {
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_DISABLE_USER_TRAFFIC:
            {
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_CLEAR_DYN_LEARN_TABLE:
            {
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_CLEAR_STATIC_LEARN_TABLE:
            {
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_CLEAR_STATS:
            {
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_CONFIGURE_MCAST_LLID:
            {
                if (!bcmolt_epon_oam_dpoe_llid_action_pack(this->u.configure_mcast_llid.llid_action, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.configure_mcast_llid.llid_value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_RETRIEVE_CURRENT_ALARM_SUMMARY:
        default:
            {
            }
            break;
    }

    bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
    if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dpoe_action_value_base_get_packed_length(bcmolt_epon_oam_dpoe_action_value_base *this)
{
    if (this->width >= 0x0080)
    {
        return this->width;
    }
    else
    {
        uint32_t count = 3;
        switch (this->leaf)
        {
            case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_RESET_ONU:
                {
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_ADD_DYN_MAC_ADDR:
                {
                    count += bcmolt_epon_oam_dpoe_mac_table_get_packed_length(&this->u.add_dyn_mac_addr.mac_addess);
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_DEL_DYN_MAC_ADDR:
                {
                    count += bcmolt_epon_oam_dpoe_mac_table_get_packed_length(&this->u.del_dyn_mac_addr.mac_address);
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_ADD_STATIC_MAC_ADDR:
                {
                    count += bcmolt_epon_oam_dpoe_mac_table_get_packed_length(&this->u.add_static_mac_addr.mac_address);
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_DEL_STATIC_MAC_ADDR:
                {
                    count += bcmolt_epon_oam_dpoe_mac_table_get_packed_length(&this->u.del_static_mac_addr.mac_address);
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_LOOPBACK_ENABLE:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_LOOPBACK_DISABLE:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_LASER_TX_POWER_OFF:
                {
                    count += 2;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_CLEAR_INGRESS_RULES:
                {
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_ADD_INGRESS_RULES:
                {
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_DEL_INGRESS_RULES:
                {
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_ENABLE_USER_TRAFFIC:
                {
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_DISABLE_USER_TRAFFIC:
                {
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_CLEAR_DYN_LEARN_TABLE:
                {
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_CLEAR_STATIC_LEARN_TABLE:
                {
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_CLEAR_STATS:
                {
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_CONFIGURE_MCAST_LLID:
                {
                    count += 3;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_RETRIEVE_CURRENT_ALARM_SUMMARY:
            default:
                {
                }
                break;
        }

        return count;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_action_value_base_unpack(bcmolt_epon_oam_dpoe_action_value_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    bcmolt_epon_oam_buf postLenBuf;
    if (!bcmolt_epon_oam_dpoe_leaf_action_unpack(&this->leaf, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->width))
    {
        return BCMOS_FALSE;
    }

    if (this->width >= 0x0080)
    {
        return BCMOS_TRUE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, (this->width == 0) ? 0x0080 : this->width, buf->curr);
    switch (this->leaf)
    {
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_RESET_ONU:
            {
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_ADD_DYN_MAC_ADDR:
            {
                if (!bcmolt_epon_oam_dpoe_mac_table_unpack(&this->u.add_dyn_mac_addr.mac_addess, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_DEL_DYN_MAC_ADDR:
            {
                if (!bcmolt_epon_oam_dpoe_mac_table_unpack(&this->u.del_dyn_mac_addr.mac_address, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_ADD_STATIC_MAC_ADDR:
            {
                if (!bcmolt_epon_oam_dpoe_mac_table_unpack(&this->u.add_static_mac_addr.mac_address, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_DEL_STATIC_MAC_ADDR:
            {
                if (!bcmolt_epon_oam_dpoe_mac_table_unpack(&this->u.del_static_mac_addr.mac_address, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_LOOPBACK_ENABLE:
            {
                if (!bcmolt_epon_oam_dpoe_loopback_location_unpack(&this->u.loopback_enable.location, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_LOOPBACK_DISABLE:
            {
                if (!bcmolt_epon_oam_dpoe_loopback_location_unpack(&this->u.loopback_disable.location, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_LASER_TX_POWER_OFF:
            {
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.laser_tx_power_off.disable_time))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_CLEAR_INGRESS_RULES:
            {
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_ADD_INGRESS_RULES:
            {
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_DEL_INGRESS_RULES:
            {
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_ENABLE_USER_TRAFFIC:
            {
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_DISABLE_USER_TRAFFIC:
            {
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_CLEAR_DYN_LEARN_TABLE:
            {
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_CLEAR_STATIC_LEARN_TABLE:
            {
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_CLEAR_STATS:
            {
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_CONFIGURE_MCAST_LLID:
            {
                if (!bcmolt_epon_oam_dpoe_llid_action_unpack(&this->u.configure_mcast_llid.llid_action, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.configure_mcast_llid.llid_value))
                {
                    /*Optional unpack fails do not cause errors */
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_RETRIEVE_CURRENT_ALARM_SUMMARY:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(buf, (this->width == 0) ? 0x0080 : this->width))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_action_value_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_dpoe_leaf_action leaf;
    bcmolt_epon_oam_buf postLenBuf;
    uint8_t length;
    if (!bcmolt_epon_oam_dpoe_leaf_action_unpack(&leaf, packed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
    {
        return BCMOS_FALSE;
    }

    if (length >= 0x0080)
    {
        return BCMOS_TRUE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
    switch (leaf)
    {
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_RESET_ONU:
            {
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_ADD_DYN_MAC_ADDR:
            {
                if (!bcmolt_epon_oam_dpoe_mac_table_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_DEL_DYN_MAC_ADDR:
            {
                if (!bcmolt_epon_oam_dpoe_mac_table_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_ADD_STATIC_MAC_ADDR:
            {
                if (!bcmolt_epon_oam_dpoe_mac_table_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_DEL_STATIC_MAC_ADDR:
            {
                if (!bcmolt_epon_oam_dpoe_mac_table_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_LOOPBACK_ENABLE:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_LOOPBACK_DISABLE:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_LASER_TX_POWER_OFF:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_CLEAR_INGRESS_RULES:
            {
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_ADD_INGRESS_RULES:
            {
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_DEL_INGRESS_RULES:
            {
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_ENABLE_USER_TRAFFIC:
            {
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_DISABLE_USER_TRAFFIC:
            {
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_CLEAR_DYN_LEARN_TABLE:
            {
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_CLEAR_STATIC_LEARN_TABLE:
            {
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_CLEAR_STATS:
            {
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_CONFIGURE_MCAST_LLID:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    /*Optional unpack fails do not cause errors */
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ACTION_RETRIEVE_CURRENT_ALARM_SUMMARY:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_queue_set_pack(bcmolt_epon_oam_dpoe_queue_set *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u8(buf, this->queue_count))
    {
        return BCMOS_FALSE;
    }

    if ((this->queue_count > 0) && (this->queue_sizes == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"queue_sizes\" of struct \"bcmolt_epon_oam_dpoe_queue_set\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write(buf, this->queue_sizes, this->queue_count))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dpoe_queue_set_get_packed_length(bcmolt_epon_oam_dpoe_queue_set *this)
{
    return 1 + this->queue_count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_queue_set_unpack(bcmolt_epon_oam_dpoe_queue_set *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->queue_count))
    {
        return BCMOS_FALSE;
    }

    if ((this->queue_count > 0) && (this->queue_sizes == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"queue_sizes\" of struct \"bcmolt_epon_oam_dpoe_queue_set\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->queue_sizes = (uint8_t *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->queue_count * sizeof(uint8_t));
        }
    }

    if (!bcmolt_epon_oam_buf_read(buf, this->queue_sizes, this->queue_count))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_queue_set_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    uint8_t queue_count;
    if (!bcmolt_epon_oam_buf_read_u8(packed, &queue_count))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * queue_count);
    if (!bcmolt_epon_oam_buf_skip(packed, queue_count * 1))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_queue_pack(bcmolt_epon_oam_dpoe_queue *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_dpoe_object_type_pack(this->type, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->instance))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->queue))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_queue_unpack(bcmolt_epon_oam_dpoe_queue *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_dpoe_object_type_unpack(&this->type, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->instance))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->queue))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_queue_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 4);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_object_context_base_pack(bcmolt_epon_oam_dpoe_object_context_base *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t preLenFieldPos;
    uint32_t bytesAfterLenField;
    if (!bcmolt_epon_oam_dpoe_object_type_pack(this->object_type, buf))
    {
        return BCMOS_FALSE;
    }

    if (this->length >= 0x0080)
    {
        bcmolt_epon_oam_buf_write_u8(buf, this->length);
        return BCMOS_TRUE;
    }

    preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

    /* skip over length field (we'll fill it in later) */
    if (!bcmolt_epon_oam_buf_skip(buf, 1))
    {
        return BCMOS_FALSE;
    }

    switch (this->object_type)
    {
        case BCMOLT_EPON_OAM_DPOE_OBJECT_TYPE_ONU:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.onu.instance))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OBJECT_TYPE_NETWORK_PON:
            {
                if ((this->u.network_pon.pon_count > 0) && (this->u.network_pon.pon == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"pon\" of struct \"bcmolt_epon_oam_dpoe_object_context_base_network_pon\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.network_pon.pon, this->u.network_pon.pon_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OBJECT_TYPE_LINK:
            {
                if ((this->u.link.link_count > 0) && (this->u.link.link == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"link\" of struct \"bcmolt_epon_oam_dpoe_object_context_base_link\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.link.link, this->u.link.link_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OBJECT_TYPE_USER_PORT:
            {
                if ((this->u.user_port.port_count > 0) && (this->u.user_port.port == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"port\" of struct \"bcmolt_epon_oam_dpoe_object_context_base_user_port\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.user_port.port, this->u.user_port.port_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OBJECT_TYPE_QUEUE:
            {
                if (!bcmolt_epon_oam_dpoe_queue_pack(&this->u.queue.queue, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OBJECT_TYPE_MCAST_LINK:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.mcast_link.mcast_llid))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OBJECT_TYPE_BRIDGE:
            {
                if ((this->u.bridge.bridge_count > 0) && (this->u.bridge.bridge == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"bridge\" of struct \"bcmolt_epon_oam_dpoe_object_context_base_bridge\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.bridge.bridge, this->u.bridge.bridge_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OBJECT_TYPE_BRIDGE_PORT:
            {
                if ((this->u.bridge_port.port_count > 0) && (this->u.bridge_port.port == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"port\" of struct \"bcmolt_epon_oam_dpoe_object_context_base_bridge_port\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.bridge_port.port, this->u.bridge_port.port_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OBJECT_TYPE_MEP:
        default:
            {
            }
            break;
    }

    bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
    if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dpoe_object_context_base_get_packed_length(bcmolt_epon_oam_dpoe_object_context_base *this)
{
    if (this->length >= 0x0080)
    {
        return this->length;
    }
    else
    {
        uint32_t count = 3;
        switch (this->object_type)
        {
            case BCMOLT_EPON_OAM_DPOE_OBJECT_TYPE_ONU:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_OBJECT_TYPE_NETWORK_PON:
                {
                    count += this->u.network_pon.pon_count;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_OBJECT_TYPE_LINK:
                {
                    count += this->u.link.link_count;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_OBJECT_TYPE_USER_PORT:
                {
                    count += this->u.user_port.port_count;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_OBJECT_TYPE_QUEUE:
                {
                    count += 4;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_OBJECT_TYPE_MCAST_LINK:
                {
                    count += 2;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_OBJECT_TYPE_BRIDGE:
                {
                    count += this->u.bridge.bridge_count;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_OBJECT_TYPE_BRIDGE_PORT:
                {
                    count += this->u.bridge_port.port_count;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_OBJECT_TYPE_MEP:
            default:
                {
                }
                break;
        }

        return count;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_object_context_base_unpack(bcmolt_epon_oam_dpoe_object_context_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    bcmolt_epon_oam_buf postLenBuf;
    if (!bcmolt_epon_oam_dpoe_object_type_unpack(&this->object_type, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->length))
    {
        return BCMOS_FALSE;
    }

    if (this->length >= 0x0080)
    {
        return BCMOS_TRUE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, (this->length == 0) ? 0x0080 : this->length, buf->curr);
    switch (this->object_type)
    {
        case BCMOLT_EPON_OAM_DPOE_OBJECT_TYPE_ONU:
            {
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.onu.instance))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OBJECT_TYPE_NETWORK_PON:
            {
                this->u.network_pon.pon_count = bcmolt_epon_oam_dpoe_object_context_base_network_pon_count_pon(&postLenBuf);
                if ((this->u.network_pon.pon_count > 0) && (this->u.network_pon.pon == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"pon\" of struct \"bcmolt_epon_oam_dpoe_object_context_base_network_pon\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.network_pon.pon = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.network_pon.pon_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.network_pon.pon, this->u.network_pon.pon_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OBJECT_TYPE_LINK:
            {
                this->u.link.link_count = bcmolt_epon_oam_dpoe_object_context_base_link_count_link(&postLenBuf);
                if ((this->u.link.link_count > 0) && (this->u.link.link == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"link\" of struct \"bcmolt_epon_oam_dpoe_object_context_base_link\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.link.link = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.link.link_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.link.link, this->u.link.link_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OBJECT_TYPE_USER_PORT:
            {
                this->u.user_port.port_count = bcmolt_epon_oam_dpoe_object_context_base_user_port_count_port(&postLenBuf);
                if ((this->u.user_port.port_count > 0) && (this->u.user_port.port == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"port\" of struct \"bcmolt_epon_oam_dpoe_object_context_base_user_port\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.user_port.port = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.user_port.port_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.user_port.port, this->u.user_port.port_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OBJECT_TYPE_QUEUE:
            {
                if (!bcmolt_epon_oam_dpoe_queue_unpack(&this->u.queue.queue, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OBJECT_TYPE_MCAST_LINK:
            {
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.mcast_link.mcast_llid))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OBJECT_TYPE_BRIDGE:
            {
                this->u.bridge.bridge_count = bcmolt_epon_oam_dpoe_object_context_base_bridge_count_bridge(&postLenBuf);
                if ((this->u.bridge.bridge_count > 0) && (this->u.bridge.bridge == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"bridge\" of struct \"bcmolt_epon_oam_dpoe_object_context_base_bridge\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.bridge.bridge = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.bridge.bridge_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.bridge.bridge, this->u.bridge.bridge_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OBJECT_TYPE_BRIDGE_PORT:
            {
                this->u.bridge_port.port_count = bcmolt_epon_oam_dpoe_object_context_base_bridge_port_count_port(&postLenBuf);
                if ((this->u.bridge_port.port_count > 0) && (this->u.bridge_port.port == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"port\" of struct \"bcmolt_epon_oam_dpoe_object_context_base_bridge_port\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.bridge_port.port = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.bridge_port.port_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.bridge_port.port, this->u.bridge_port.port_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OBJECT_TYPE_MEP:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(buf, (this->length == 0) ? 0x0080 : this->length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_object_context_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_dpoe_object_type object_type;
    bcmolt_epon_oam_buf postLenBuf;
    uint8_t length;
    if (!bcmolt_epon_oam_dpoe_object_type_unpack(&object_type, packed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
    {
        return BCMOS_FALSE;
    }

    if (length >= 0x0080)
    {
        return BCMOS_TRUE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
    switch (object_type)
    {
        case BCMOLT_EPON_OAM_DPOE_OBJECT_TYPE_ONU:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OBJECT_TYPE_NETWORK_PON:
            {
                uint32_t pon_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                    {
                        break;
                    }

                    pon_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(pon_elem_count * sizeof(uint8_t));
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OBJECT_TYPE_LINK:
            {
                uint32_t link_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                    {
                        break;
                    }

                    link_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(link_elem_count * sizeof(uint8_t));
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OBJECT_TYPE_USER_PORT:
            {
                uint32_t port_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                    {
                        break;
                    }

                    port_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(port_elem_count * sizeof(uint8_t));
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OBJECT_TYPE_QUEUE:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OBJECT_TYPE_MCAST_LINK:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OBJECT_TYPE_BRIDGE:
            {
                uint32_t bridge_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                    {
                        break;
                    }

                    bridge_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(bridge_elem_count * sizeof(uint8_t));
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OBJECT_TYPE_BRIDGE_PORT:
            {
                uint32_t port_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                    {
                        break;
                    }

                    port_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(port_elem_count * sizeof(uint8_t));
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OBJECT_TYPE_MEP:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dpoe_object_context_base_network_pon_count_pon(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dpoe_object_context_base_link_count_link(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dpoe_object_context_base_user_port_count_port(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dpoe_object_context_base_bridge_count_bridge(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dpoe_object_context_base_bridge_port_count_port(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_var_descriptor_pack(bcmolt_epon_oam_dpoe_var_descriptor *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_dpoe_branch_pack(this->branch, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->branch)
    {
        case BCMOLT_EPON_OAM_DPOE_BRANCH_END:
            {
                if ((this->u.end.unknown_count > 0) && (this->u.end.unknown == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"unknown\" of struct \"bcmolt_epon_oam_dpoe_var_descriptor_end\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.end.unknown, this->u.end.unknown_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_STANDARD_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_var_leaf_attribute_pack(this->u.standard_attribute.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_STANDARD_ACTION:
            {
                if (!bcmolt_epon_oam_var_leaf_action_pack(this->u.standard_action.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_OBJECT:
            {
                if (!bcmolt_epon_oam_dpoe_object_context_base_pack(&this->u.object.object_context, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_EXTENDED_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_dpoe_leaf_attribute_pack(this->u.extended_attribute.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_EXTENDED_ACTION:
            {
                if (!bcmolt_epon_oam_dpoe_leaf_action_pack(this->u.extended_action.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_PROGRAMMABLE_COUNTER:
        default:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.def.leaf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dpoe_var_descriptor_get_packed_length(bcmolt_epon_oam_dpoe_var_descriptor *this)
{
    uint32_t count = 1;
    switch (this->branch)
    {
        case BCMOLT_EPON_OAM_DPOE_BRANCH_END:
            {
                count += this->u.end.unknown_count;
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_STANDARD_ATTRIBUTE:
            {
                count += 2;
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_STANDARD_ACTION:
            {
                count += 2;
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_OBJECT:
            {
                count += bcmolt_epon_oam_dpoe_object_context_base_get_packed_length(&this->u.object.object_context);
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_EXTENDED_ATTRIBUTE:
            {
                count += 2;
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_EXTENDED_ACTION:
            {
                count += 2;
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_PROGRAMMABLE_COUNTER:
        default:
            {
                count += 2;
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_var_descriptor_unpack(bcmolt_epon_oam_dpoe_var_descriptor *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_dpoe_branch_unpack(&this->branch, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->branch)
    {
        case BCMOLT_EPON_OAM_DPOE_BRANCH_END:
            {
                this->u.end.unknown_count = bcmolt_epon_oam_dpoe_var_descriptor_end_count_unknown(buf);
                if ((this->u.end.unknown_count > 0) && (this->u.end.unknown == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"unknown\" of struct \"bcmolt_epon_oam_dpoe_var_descriptor_end\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.end.unknown = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.end.unknown_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.end.unknown, this->u.end.unknown_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_STANDARD_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_var_leaf_attribute_unpack(&this->u.standard_attribute.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_STANDARD_ACTION:
            {
                if (!bcmolt_epon_oam_var_leaf_action_unpack(&this->u.standard_action.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_OBJECT:
            {
                if (!bcmolt_epon_oam_dpoe_object_context_base_unpack(&this->u.object.object_context, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_EXTENDED_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_dpoe_leaf_attribute_unpack(&this->u.extended_attribute.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_EXTENDED_ACTION:
            {
                if (!bcmolt_epon_oam_dpoe_leaf_action_unpack(&this->u.extended_action.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_PROGRAMMABLE_COUNTER:
        default:
            {
                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.def.leaf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_var_descriptor_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_dpoe_branch branch;
    if (!bcmolt_epon_oam_dpoe_branch_unpack(&branch, packed))
    {
        return BCMOS_FALSE;
    }

    switch (branch)
    {
        case BCMOLT_EPON_OAM_DPOE_BRANCH_END:
            {
                uint32_t unknown_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(packed, 1))
                    {
                        break;
                    }

                    unknown_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(unknown_elem_count * sizeof(uint8_t));
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_STANDARD_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_STANDARD_ACTION:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_OBJECT:
            {
                if (!bcmolt_epon_oam_dpoe_object_context_base_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_EXTENDED_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_EXTENDED_ACTION:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_PROGRAMMABLE_COUNTER:
        default:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dpoe_var_descriptor_end_count_unknown(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_statistic_threshold_pack(bcmolt_epon_oam_dpoe_statistic_threshold *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_dpoe_var_descriptor_pack(&this->statistic, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->rising_threshold))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->falling_threshold))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dpoe_statistic_threshold_get_packed_length(bcmolt_epon_oam_dpoe_statistic_threshold *this)
{
    return 8 + bcmolt_epon_oam_dpoe_var_descriptor_get_packed_length(&this->statistic);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_statistic_threshold_unpack(bcmolt_epon_oam_dpoe_statistic_threshold *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_dpoe_var_descriptor_unpack(&this->statistic, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->rising_threshold))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->falling_threshold))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_statistic_threshold_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    if (!bcmolt_epon_oam_dpoe_var_descriptor_scan(packed, extra_mem))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_field_pack(bcmolt_epon_oam_dpoe_field *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_dpoe_field_code_pack(this->code, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->instance))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_field_unpack(bcmolt_epon_oam_dpoe_field *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_dpoe_field_code_unpack(&this->code, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->instance))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_field_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 2);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_rule_result_field_v2_pack(bcmolt_epon_oam_dpoe_rule_result_field_v2 *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_dpoe_field_pack(&this->field, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->msb_mask))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->lsb_mask))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_rule_result_field_v2_unpack(bcmolt_epon_oam_dpoe_rule_result_field_v2 *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_dpoe_field_unpack(&this->field, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->msb_mask))
    {
        /*Optional unpack fails do not cause errors */
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->lsb_mask))
    {
        /*Optional unpack fails do not cause errors */
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_rule_result_field_v2_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 4);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_rule_result_field_pack(bcmolt_epon_oam_dpoe_rule_result_field *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_dpoe_field_pack(&this->field, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_rule_result_field_unpack(bcmolt_epon_oam_dpoe_rule_result_field *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_dpoe_field_unpack(&this->field, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_rule_result_field_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 2);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_rule_result_pack(bcmolt_epon_oam_dpoe_rule_result *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_dpoe_result_pack(this->result, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->result)
    {
        case BCMOLT_EPON_OAM_DPOE_RESULT_NOP:
            {
                /* no data to pack for empty */
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_RESULT_DISCARD:
            {
                /* no data to pack for empty */
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_RESULT_FORWARD:
            {
                /* no data to pack for empty */
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_RESULT_QUEUE:
            {
                if (!bcmolt_epon_oam_dpoe_queue_pack(&this->u.queue.queue, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_RESULT_SET:
            {
                if (!bcmolt_epon_oam_dpoe_rule_result_field_v2_pack(&this->u.set.field, buf))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.set.value_count > 0) && (this->u.set.value == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"value\" of struct \"bcmolt_epon_oam_dpoe_rule_result_set\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.set.value, this->u.set.value_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_RESULT_COPY:
            {
                if (!bcmolt_epon_oam_dpoe_rule_result_field_v2_pack(&this->u.copy.field, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_RESULT_DELETE:
            {
                if (!bcmolt_epon_oam_dpoe_rule_result_field_pack(&this->u.delete.field, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_RESULT_INSERT:
            {
                if (!bcmolt_epon_oam_dpoe_rule_result_field_pack(&this->u.insert.field, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_RESULT_REPLACE:
            {
                if (!bcmolt_epon_oam_dpoe_rule_result_field_pack(&this->u.replace.field, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_RESULT_CLEAR_DELETE:
            {
                if (!bcmolt_epon_oam_dpoe_rule_result_field_pack(&this->u.clear_delete.field, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_RESULT_CLEAR_INSERT:
            {
                if (!bcmolt_epon_oam_dpoe_rule_result_field_pack(&this->u.clear_insert.field, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dpoe_rule_result_get_packed_length(bcmolt_epon_oam_dpoe_rule_result *this)
{
    uint32_t count = 1;
    switch (this->result)
    {
        case BCMOLT_EPON_OAM_DPOE_RESULT_NOP:
            {
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_RESULT_DISCARD:
            {
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_RESULT_FORWARD:
            {
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_RESULT_QUEUE:
            {
                count += 4;
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_RESULT_SET:
            {
                count += 4 + this->u.set.value_count;
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_RESULT_COPY:
            {
                count += 4;
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_RESULT_DELETE:
            {
                count += 2;
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_RESULT_INSERT:
            {
                count += 2;
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_RESULT_REPLACE:
            {
                count += 2;
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_RESULT_CLEAR_DELETE:
            {
                count += 2;
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_RESULT_CLEAR_INSERT:
            {
                count += 2;
            }
            break;
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_rule_result_unpack(bcmolt_epon_oam_dpoe_rule_result *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_dpoe_result_unpack(&this->result, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->result)
    {
        case BCMOLT_EPON_OAM_DPOE_RESULT_NOP:
            {
                /* no data to unpack */
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_RESULT_DISCARD:
            {
                /* no data to unpack */
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_RESULT_FORWARD:
            {
                /* no data to unpack */
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_RESULT_QUEUE:
            {
                if (!bcmolt_epon_oam_dpoe_queue_unpack(&this->u.queue.queue, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_RESULT_SET:
            {
                if (!bcmolt_epon_oam_dpoe_rule_result_field_v2_unpack(&this->u.set.field, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                this->u.set.value_count = bcmolt_epon_oam_dpoe_rule_result_set_count_value(buf);
                if ((this->u.set.value_count > 0) && (this->u.set.value == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"value\" of struct \"bcmolt_epon_oam_dpoe_rule_result_set\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.set.value = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.set.value_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.set.value, this->u.set.value_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_RESULT_COPY:
            {
                if (!bcmolt_epon_oam_dpoe_rule_result_field_v2_unpack(&this->u.copy.field, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_RESULT_DELETE:
            {
                if (!bcmolt_epon_oam_dpoe_rule_result_field_unpack(&this->u.delete.field, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_RESULT_INSERT:
            {
                if (!bcmolt_epon_oam_dpoe_rule_result_field_unpack(&this->u.insert.field, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_RESULT_REPLACE:
            {
                if (!bcmolt_epon_oam_dpoe_rule_result_field_unpack(&this->u.replace.field, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_RESULT_CLEAR_DELETE:
            {
                if (!bcmolt_epon_oam_dpoe_rule_result_field_unpack(&this->u.clear_delete.field, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_RESULT_CLEAR_INSERT:
            {
                if (!bcmolt_epon_oam_dpoe_rule_result_field_unpack(&this->u.clear_insert.field, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_rule_result_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_dpoe_result result;
    if (!bcmolt_epon_oam_dpoe_result_unpack(&result, packed))
    {
        return BCMOS_FALSE;
    }

    switch (result)
    {
        case BCMOLT_EPON_OAM_DPOE_RESULT_NOP:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 0))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_RESULT_DISCARD:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 0))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_RESULT_FORWARD:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 0))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_RESULT_QUEUE:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_RESULT_SET:
            {
                uint32_t value_elem_count = 0;
                if (!bcmolt_epon_oam_dpoe_rule_result_field_v2_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(packed, 1))
                    {
                        break;
                    }

                    value_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(value_elem_count * sizeof(uint8_t));
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_RESULT_COPY:
            {
                if (!bcmolt_epon_oam_dpoe_rule_result_field_v2_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_RESULT_DELETE:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_RESULT_INSERT:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_RESULT_REPLACE:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_RESULT_CLEAR_DELETE:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_RESULT_CLEAR_INSERT:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dpoe_rule_result_set_count_value(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_rule_pack(bcmolt_epon_oam_dpoe_rule *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_rule_type_pack(this->subtype, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->subtype)
    {
        case BCMOLT_EPON_OAM_RULE_TYPE_TERMINATOR:
            {
            }
            break;
        case BCMOLT_EPON_OAM_RULE_TYPE_HEADER:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.header.precedence))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_RULE_TYPE_CLAUSE:
            {
                if (!bcmolt_epon_oam_dpoe_field_pack(&this->u.clause.field_code, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.clause.msb_mask))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.clause.lsb_mask))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_rule_operator_pack(this->u.clause.operator, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.clause.match_value_length))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.clause.match_value_length > 0) && (this->u.clause.match_value == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"match_value\" of struct \"bcmolt_epon_oam_dpoe_rule_clause\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.clause.match_value, this->u.clause.match_value_length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_RULE_TYPE_RESULT:
            {
                if (!bcmolt_epon_oam_dpoe_rule_result_pack(&this->u.result.result, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_RULE_TYPE_ENTRY:
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dpoe_rule_get_packed_length(bcmolt_epon_oam_dpoe_rule *this)
{
    uint32_t count = 1;
    switch (this->subtype)
    {
        case BCMOLT_EPON_OAM_RULE_TYPE_TERMINATOR:
            {
            }
            break;
        case BCMOLT_EPON_OAM_RULE_TYPE_HEADER:
            {
                count += 1;
            }
            break;
        case BCMOLT_EPON_OAM_RULE_TYPE_CLAUSE:
            {
                count += 6 + this->u.clause.match_value_length;
            }
            break;
        case BCMOLT_EPON_OAM_RULE_TYPE_RESULT:
            {
                count += bcmolt_epon_oam_dpoe_rule_result_get_packed_length(&this->u.result.result);
            }
            break;
        case BCMOLT_EPON_OAM_RULE_TYPE_ENTRY:
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_rule_unpack(bcmolt_epon_oam_dpoe_rule *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_rule_type_unpack(&this->subtype, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->subtype)
    {
        case BCMOLT_EPON_OAM_RULE_TYPE_TERMINATOR:
            {
            }
            break;
        case BCMOLT_EPON_OAM_RULE_TYPE_HEADER:
            {
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.header.precedence))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_RULE_TYPE_CLAUSE:
            {
                if (!bcmolt_epon_oam_dpoe_field_unpack(&this->u.clause.field_code, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.clause.msb_mask))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.clause.lsb_mask))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_rule_operator_unpack(&this->u.clause.operator, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.clause.match_value_length))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.clause.match_value_length > 0) && (this->u.clause.match_value == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"match_value\" of struct \"bcmolt_epon_oam_dpoe_rule_clause\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.clause.match_value = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.clause.match_value_length * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.clause.match_value, this->u.clause.match_value_length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_RULE_TYPE_RESULT:
            {
                if (!bcmolt_epon_oam_dpoe_rule_result_unpack(&this->u.result.result, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_RULE_TYPE_ENTRY:
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_rule_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_rule_type subtype;
    if (!bcmolt_epon_oam_rule_type_unpack(&subtype, packed))
    {
        return BCMOS_FALSE;
    }

    switch (subtype)
    {
        case BCMOLT_EPON_OAM_RULE_TYPE_TERMINATOR:
            {
            }
            break;
        case BCMOLT_EPON_OAM_RULE_TYPE_HEADER:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_RULE_TYPE_CLAUSE:
            {
                uint8_t match_value_length;
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(packed, &match_value_length))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * match_value_length);
                if (!bcmolt_epon_oam_buf_skip(packed, match_value_length * 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_RULE_TYPE_RESULT:
            {
                if (!bcmolt_epon_oam_dpoe_rule_result_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_RULE_TYPE_ENTRY:
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_shaper_pack(bcmolt_epon_oam_dpoe_shaper *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u8(buf, this->queue_bitmap))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->maximum_rate))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->burst_size))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_shaper_unpack(bcmolt_epon_oam_dpoe_shaper *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->queue_bitmap))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->maximum_rate))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->burst_size))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_shaper_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 7);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_rate_level_pack(bcmolt_epon_oam_dpoe_rate_level *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_traffic_bitmap_pack(this->traffic_type, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->maximum_rate))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_rate_level_unpack(bcmolt_epon_oam_dpoe_rate_level *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_traffic_bitmap_unpack(&this->traffic_type, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->maximum_rate))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_rate_level_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 5);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_event_options_pack(bcmolt_epon_oam_dpoe_event_options *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u8(buf, this->event_code))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->enabled_disabled))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_event_options_unpack(bcmolt_epon_oam_dpoe_event_options *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->event_code))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->enabled_disabled))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_event_options_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 2);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_u16_list_u8_pack(bcmolt_epon_oam_u16_list_u8 *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t i0;
    if (!bcmolt_epon_oam_buf_write_u8(buf, this->len))
    {
        return BCMOS_FALSE;
    }

    if ((this->len > 0) && (this->val == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"val\" of struct \"bcmolt_epon_oam_u16_list_u8\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->len; i0++)
    {
        if (!bcmolt_epon_oam_buf_write_u16(buf, this->val[i0]))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_u16_list_u8_get_packed_length(bcmolt_epon_oam_u16_list_u8 *this)
{
    return 1 + (2 * this->len);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_u16_list_u8_unpack(bcmolt_epon_oam_u16_list_u8 *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint8_t i0;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->len))
    {
        return BCMOS_FALSE;
    }

    if ((this->len > 0) && (this->val == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"val\" of struct \"bcmolt_epon_oam_u16_list_u8\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->val = (uint16_t *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->len * sizeof(uint16_t));
        }
    }

    for (i0 = 0; i0 < this->len; i0++)
    {
        if (!bcmolt_epon_oam_buf_read_u16(buf, &this->val[i0]))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_u16_list_u8_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    uint8_t len;
    if (!bcmolt_epon_oam_buf_read_u8(packed, &len))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint16_t) * len);
    if (!bcmolt_epon_oam_buf_skip(packed, len * 2))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_attribute_value_base_pack(bcmolt_epon_oam_dpoe_attribute_value_base *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t preLenFieldPos;
    uint32_t bytesAfterLenField;
    if (!bcmolt_epon_oam_dpoe_leaf_attribute_pack(this->leaf, buf))
    {
        return BCMOS_FALSE;
    }

    if (this->width >= 0x0080)
    {
        bcmolt_epon_oam_buf_write_u8(buf, this->width);
        return BCMOS_TRUE;
    }

    preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

    /* skip over length field (we'll fill it in later) */
    if (!bcmolt_epon_oam_buf_skip(buf, 1))
    {
        return BCMOS_FALSE;
    }

    switch (this->leaf)
    {
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_SEQUENCE_NUMBER:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.sequence_number.sequnce_number))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_ONU_ID:
            {
                if (!bcmolt_epon_oam_buf_write_mac_address(buf, this->u.onu_id.id))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_FIRMWARE_INFO:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.firmware_info.boot_version))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.firmware_info.boot_crc32))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.firmware_info.application_version))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.firmware_info.application_crc32))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_CHIP_INFO:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.chip_info.jedec_id))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.chip_info.chip_model))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.chip_info.chip_version))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_DATE_OF_MANUFACTURE:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.date_of_manufacture.year))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.date_of_manufacture.month))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.date_of_manufacture.day))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_MANUFACTURER_INFO:
            {
                if ((this->u.manufacturer_info.def_count > 0) && (this->u.manufacturer_info.def == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"def\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_manufacturer_info\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.manufacturer_info.def, this->u.manufacturer_info.def_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_MAX_LOGICAL_LINKS:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.max_logical_links.bidirectional))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.max_logical_links.downstream_only))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_NUM_EPON_PORTS:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.num_epon_ports.port_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_NUM_UNI_PORTS:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.num_uni_ports.port_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_PACKET_BUFFER:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.packet_buffer.upstream_queues))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.packet_buffer.up_queues_max_per_link))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.packet_buffer.up_queue_increment))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.packet_buffer.downstream_queues))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.packet_buffer.dn_queues_max_per_port))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.packet_buffer.dn_queue_increment))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.packet_buffer.total_packet_buffer))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.packet_buffer.upstream_packet_buffer))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.packet_buffer.downsream_packet_buffer))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_REPORT_THRESHOLDS:
            {
                uint8_t i0;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.report_thresholds.number_of_queue_sets))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.report_thresholds.report_values_per_queue_set))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.report_thresholds.report_values_per_queue_set > 0) && (this->u.report_thresholds.queue_set0 == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"queue_set0\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_report_thresholds\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i0 = 0; i0 < this->u.report_thresholds.report_values_per_queue_set; i0++)
                {
                    if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.report_thresholds.queue_set0[i0]))
                    {
                        return BCMOS_FALSE;
                    }
                }

                if (((uint64_t) this->u.report_thresholds.number_of_queue_sets > 0x0001))
                {
                    if ((this->u.report_thresholds.report_values_per_queue_set > 0) && (this->u.report_thresholds.queue_set1 == NULL))
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"queue_set1\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_report_thresholds\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }

                    uint8_t i1;
                    for (i1 = 0; i1 < this->u.report_thresholds.report_values_per_queue_set; i1++)
                    {
                        if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.report_thresholds.queue_set1[i1]))
                        {
                            return BCMOS_FALSE;
                        }
                    }
                }

                if (((uint64_t) this->u.report_thresholds.number_of_queue_sets > 0x0002))
                {
                    if ((this->u.report_thresholds.report_values_per_queue_set > 0) && (this->u.report_thresholds.queue_set2 == NULL))
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"queue_set2\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_report_thresholds\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }

                    uint8_t i2;
                    for (i2 = 0; i2 < this->u.report_thresholds.report_values_per_queue_set; i2++)
                    {
                        if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.report_thresholds.queue_set2[i2]))
                        {
                            return BCMOS_FALSE;
                        }
                    }
                }

                if (((uint64_t) this->u.report_thresholds.number_of_queue_sets > 0x0003))
                {
                    if ((this->u.report_thresholds.report_values_per_queue_set > 0) && (this->u.report_thresholds.queue_set3 == NULL))
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"queue_set3\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_report_thresholds\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }

                    uint8_t i3;
                    for (i3 = 0; i3 < this->u.report_thresholds.report_values_per_queue_set; i3++)
                    {
                        if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.report_thresholds.queue_set3[i3]))
                        {
                            return BCMOS_FALSE;
                        }
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_LINK_STATE:
            {
                if (!bcmolt_epon_oam_dpoe_link_state_pack(this->u.link_state.link_state, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_OAM_RATE:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.oam_rate.maximum_oam_rate))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.oam_rate.minimum_oam_rate))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_DYN_LEARN_TABLE_SIZE:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.dyn_learn_table_size.max_mac_allowed))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_DYN_LEARN_AGE_LIMIT:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.dyn_learn_age_limit.dynamic_address_age_limit))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_DYN_MAC_TABLE:
            {
                if (!bcmolt_epon_oam_dpoe_mac_table_pack(&this->u.dyn_mac_table.mac_address, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_STATIC_MAC_TABLE:
            {
                if (!bcmolt_epon_oam_dpoe_mac_table_pack(&this->u.static_mac_table.mac_address, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_PORT_CAPABILITY:
            {
                if (!bcmolt_epon_oam_auto_negotiation_capability_pack(this->u.port_capability.maximum_capabilities, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_auto_negotiation_capability_pack(this->u.port_capability.current_capabilities, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_DYN_LEARN_MODE:
            {
                if (!bcmolt_epon_oam_dpoe_learning_mode_pack(this->u.dyn_learn_mode.learning_mode, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_MIN_MAC_LIMIT:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.min_mac_limit.minimum_guaranteed_limit))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_MAX_MAC_ALLOWED:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.max_mac_allowed.max_allowed))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_AGG_MAC_LIMIT:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.agg_mac_limit.aggregate_mac_limit))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_LEN_ERR_DISCARD:
            {
                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.len_err_discard.len_error_discard))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_FLOOD_UNKNOWN:
            {
                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.flood_unknown.flood_unknown))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_LOCAL_SWITCHING:
            {
                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.local_switching.local_switching))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_QUEUE_CONFIG:
            {
                uint8_t i4;
                uint8_t i5;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.queue_config.number_of_links))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.queue_config.number_of_links > 0) && (this->u.queue_config.link_configuration == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"link_configuration\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_queue_config\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i4 = 0; i4 < this->u.queue_config.number_of_links; i4++)
                {
                    if (!bcmolt_epon_oam_dpoe_queue_set_pack(&this->u.queue_config.link_configuration[i4], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.queue_config.number_of_ports))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.queue_config.number_of_ports > 0) && (this->u.queue_config.port_configuration == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"port_configuration\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_queue_config\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i5 = 0; i5 < this->u.queue_config.number_of_ports; i5++)
                {
                    if (!bcmolt_epon_oam_dpoe_queue_set_pack(&this->u.queue_config.port_configuration[i5], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_FIRMWARE_FILENAME:
            {
                if ((this->u.firmware_filename.firmware_filename_count > 0) && (this->u.firmware_filename.firmware_filename == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"firmware_filename\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_firmware_filename\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.firmware_filename.firmware_filename, this->u.firmware_filename.firmware_filename_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, 0))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_PORT_STAT_THRESH:
            {
                if (!bcmolt_epon_oam_dpoe_statistic_threshold_pack(&this->u.port_stat_thresh.stat_threshold, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_LINK_STAT_THRESH:
            {
                if (!bcmolt_epon_oam_dpoe_statistic_threshold_pack(&this->u.link_stat_thresh.stat_threshold, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_KEY_EXPIRY_TIME:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.key_expiry_time.time))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_ENCRYPT_MODE:
            {
                if (!bcmolt_epon_oam_dpoe_encryption_mode_pack(this->u.encrypt_mode.encryption_method, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_PORT_INGRESS_RULE:
            {
                if (!bcmolt_epon_oam_dpoe_rule_pack(&this->u.port_ingress_rule.rule, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_LUE_FIELD:
            {
                if (!bcmolt_epon_oam_dpoe_field_code_pack(this->u.lue_field.field_code, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_dpoe_layer_select_pack(this->u.lue_field.layer_select, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.lue_field.bit_word_offset))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.lue_field.bit_offset))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.lue_field.bit_width))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.lue_field.reference_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_ALT_CVLAN_ETHERTYPE:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.alt_cvlan_ethertype.tpid))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.alt_cvlan_ethertype.insert))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_ALT_SVLAN_ETHERTYPE:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.alt_svlan_ethertype.tpid))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.alt_svlan_ethertype.insert))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_BC_RATE_LIMIT:
            {
                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.bc_rate_limit.limit))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_EGRESS_SHAPING:
            {
                uint8_t i6;
                if (!bcmolt_epon_oam_traffic_bitmap_pack(this->u.egress_shaping.traffic_types, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_rate_units_pack(this->u.egress_shaping.rate_units, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.egress_shaping.number_of_shapers))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.egress_shaping.number_of_shapers > 0) && (this->u.egress_shaping.shapers == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"shapers\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_egress_shaping\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i6 = 0; i6 < this->u.egress_shaping.number_of_shapers; i6++)
                {
                    if (!bcmolt_epon_oam_dpoe_shaper_pack(&this->u.egress_shaping.shapers[i6], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_INGRESS_POLICING:
            {
                uint8_t i7;
                if (!bcmolt_epon_oam_rate_units_pack(this->u.ingress_policing.rate_units, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.ingress_policing.number_of_rate_levels))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.ingress_policing.number_of_rate_levels > 0) && (this->u.ingress_policing.rate_levels == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"rate_levels\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_ingress_policing\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i7 = 0; i7 < this->u.ingress_policing.number_of_rate_levels; i7++)
                {
                    if (!bcmolt_epon_oam_dpoe_rate_level_pack(&this->u.ingress_policing.rate_levels[i7], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_FEC_MODE:
            {
                if (!bcmolt_epon_oam_dpoe_fec_mode_pack(this->u.fec_mode.rx_down, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_dpoe_fec_mode_pack(this->u.fec_mode.tx_up, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_MFR_NAME:
            {
                if ((this->u.mfr_name.man_name_count > 0) && (this->u.mfr_name.man_name == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"man_name\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_mfr_name\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.mfr_name.man_name, this->u.mfr_name.man_name_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_FWARE_MFG_TIME_VAR_CTRL:
            {
                if (!bcmolt_epon_oam_buf_write(buf, this->u.fware_mfg_time_var_ctrl.code_access_start, 13))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.fware_mfg_time_var_ctrl.cvc_access_start, 13))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_VENDOR_NAME:
            {
                if ((this->u.vendor_name.vendor_name_count > 0) && (this->u.vendor_name.vendor_name == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vendor_name\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_vendor_name\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (this->u.vendor_name.vendor_name_count > 31)
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.vendor_name.vendor_name, this->u.vendor_name.vendor_name_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_MODEL_NUMBER:
            {
                if ((this->u.model_number.model_number_count > 0) && (this->u.model_number.model_number == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"model_number\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_model_number\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (this->u.model_number.model_number_count > 31)
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.model_number.model_number, this->u.model_number.model_number_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_HW_VERSION:
            {
                if ((this->u.hw_version.hw_version_count > 0) && (this->u.hw_version.hw_version == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"hw_version\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_hw_version\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (this->u.hw_version.hw_version_count > 31)
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.hw_version.hw_version, this->u.hw_version.hw_version_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_OPT_MON_TEMPERATURE:
            {
                uint32_t i8;
                if ((this->u.opt_mon_temperature.current_temperature_count > 0) && (this->u.opt_mon_temperature.current_temperature == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"current_temperature\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_opt_mon_temperature\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (this->u.opt_mon_temperature.current_temperature_count > 4)
                {
                    return BCMOS_FALSE;
                }

                for (i8 = 0; i8 < this->u.opt_mon_temperature.current_temperature_count; i8++)
                {
                    if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.opt_mon_temperature.current_temperature[i8]))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_OPT_MON_VCC:
            {
                uint32_t i9;
                if ((this->u.opt_mon_vcc.current_vcc_count > 0) && (this->u.opt_mon_vcc.current_vcc == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"current_vcc\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_opt_mon_vcc\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (this->u.opt_mon_vcc.current_vcc_count > 4)
                {
                    return BCMOS_FALSE;
                }

                for (i9 = 0; i9 < this->u.opt_mon_vcc.current_vcc_count; i9++)
                {
                    if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.opt_mon_vcc.current_vcc[i9]))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_OPT_MON_TX_BIAS:
            {
                uint32_t i10;
                if ((this->u.opt_mon_tx_bias.current_tx_bias_count > 0) && (this->u.opt_mon_tx_bias.current_tx_bias == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"current_tx_bias\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_opt_mon_tx_bias\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (this->u.opt_mon_tx_bias.current_tx_bias_count > 4)
                {
                    return BCMOS_FALSE;
                }

                for (i10 = 0; i10 < this->u.opt_mon_tx_bias.current_tx_bias_count; i10++)
                {
                    if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.opt_mon_tx_bias.current_tx_bias[i10]))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_OPT_MON_TX_POWER:
            {
                uint32_t i11;
                if ((this->u.opt_mon_tx_power.current_tx_power_count > 0) && (this->u.opt_mon_tx_power.current_tx_power == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"current_tx_power\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_opt_mon_tx_power\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (this->u.opt_mon_tx_power.current_tx_power_count > 4)
                {
                    return BCMOS_FALSE;
                }

                for (i11 = 0; i11 < this->u.opt_mon_tx_power.current_tx_power_count; i11++)
                {
                    if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.opt_mon_tx_power.current_tx_power[i11]))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_OPT_MON_RX_POWER:
            {
                uint32_t i12;
                if ((this->u.opt_mon_rx_power.current_rx_power_count > 0) && (this->u.opt_mon_rx_power.current_rx_power == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"current_rx_power\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_opt_mon_rx_power\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (this->u.opt_mon_rx_power.current_rx_power_count > 4)
                {
                    return BCMOS_FALSE;
                }

                for (i12 = 0; i12 < this->u.opt_mon_rx_power.current_rx_power_count; i12++)
                {
                    if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.opt_mon_rx_power.current_rx_power[i12]))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_UNICAST_FRAMES:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.rx_unicast_frames.rx_unicast_frames))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_UNICAST_FRAMES:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.tx_unicast_frames.tx_unicast_frames))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAME_TOO_SHORT:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.rx_frame_too_short.rx_frames_too_short))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAME64:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.rx_frame64.rx_frames64))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAME65127:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.rx_frame65127.rx_frames65127))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAME128255:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.rx_frame128255.rx_frames128255))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAME256511:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.rx_frame256511.rx_frames256511))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAME5121023:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.rx_frame5121023.rx_frames5121023))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAME10241518:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.rx_frame10241518.rx_frames10241518))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAME1519PLUS:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.rx_frame1519plus.rx_frames1519plus))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_FRAME64:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.tx_frame64.tx_frames64))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_FRAME65127:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.tx_frame65127.tx_frames65127))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_FRAME128255:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.tx_frame128255.tx_frames128255))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_FRAME256511:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.tx_frame256511.tx_frames256511))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_FRAME5121023:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.tx_frame5121023.tx_frames5121023))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_FRAME10241518:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.tx_frame10241518.tx_frames10241518))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_FRAME1519PLUS:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.tx_frame1519plus.tx_frames1519plus))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_QUEUE_DELAY_THRESH:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.queue_delay_thresh.queue_delay_threshold))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_QUEUE_DELAY:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.queue_delay.queue_delay))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_FRAMES_DROPPED:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.frames_dropped.frames_dropped))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_BYTES_DROPPED:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.bytes_dropped.bytes_dropped))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_BYTES_DELAYED:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.bytes_delayed.bytes_delayed))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_BYTES_UNUSED:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.tx_bytes_unused.tx_bytes_unused))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_DONU_PORT_TYPE:
            {
                uint32_t i13;
                if ((this->u.donu_port_type.port_type_count > 0) && (this->u.donu_port_type.port_type == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"port_type\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_donu_port_type\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i13 = 0; i13 < this->u.donu_port_type.port_type_count; i13++)
                {
                    if (!bcmolt_epon_oam_dpoe_port_type_pack(this->u.donu_port_type.port_type[i13], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_SUSPEND_RESUME_ALARM_REPORTING:
            {
                uint32_t i14;
                if ((this->u.suspend_resume_alarm_reporting.def_count > 0) && (this->u.suspend_resume_alarm_reporting.def == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"def\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_suspend_resume_alarm_reporting\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i14 = 0; i14 < this->u.suspend_resume_alarm_reporting.def_count; i14++)
                {
                    if (!bcmolt_epon_oam_dpoe_event_options_pack(&this->u.suspend_resume_alarm_reporting.def[i14], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_IPMC_FORWARDING_RULE_CONFIGURATION:
            {
                if (!bcmolt_epon_oam_dpoe_ipmc_forwarding_flags_pack(this->u.ipmc_forwarding_rule_configuration.field_bitmap, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_ITPID:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.itpid.alternate_itpid))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.itpid.insert_this_tpid))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_BTPID:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.btpid.alternate_btpid))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.btpid.insert_this_tpid))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_QUEUE_CIR:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.queue_cir.commited_burst_size))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.queue_cir.commited_information_rate))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_QUEUE_EIR:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.queue_eir.excess_burst_size))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.queue_eir.queue_eir))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_QUEUE_COLOR_MARKING:
            {
                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.queue_color_marking.enable_color_marking))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.queue_color_marking.field_code))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.queue_color_marking.field_instance))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.queue_color_marking.msb_mask))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.queue_color_marking.lsb_mask))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.queue_color_marking.green_value))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.queue_color_marking.yellow_value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_QUEUE_RATE_LIMITER_CAPABILITIES:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.queue_rate_limiter_capabilities.number_of_rate_limiters))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.queue_rate_limiter_capabilities.cbs_min_increment))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.queue_rate_limiter_capabilities.cir_min_increment))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.queue_rate_limiter_capabilities.ebs_min_increment))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.queue_rate_limiter_capabilities.eir_min_increment))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.queue_rate_limiter_capabilities.color_aware))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.queue_rate_limiter_capabilities.coupling_configurable))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.queue_rate_limiter_capabilities.coupling_behaviro_default))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.queue_rate_limiter_capabilities.color_marking_support))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.queue_rate_limiter_capabilities.smart_color_drop))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_COUPLING_FLAG:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.coupling_flag.coupling_flag))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_CLOCK_TRANSPORT_CAPABILITIES:
            {
                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.clock_transport_capabilities.pps_pulse_support))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.clock_transport_capabilities.tod_string_support))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.clock_transport_capabilities.v2frame_support))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_ENABLE_CLOCK_TRANSPORT:
            {
                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.enable_clock_transport.pps_pulse_output))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.enable_clock_transport.tod_string_output))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.enable_clock_transport.v2frame_output))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TIME_TRANSFER:
            {
                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.time_transfer.mpcp_reference_point))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.time_transfer.tod_string_count > 0) && (this->u.time_transfer.tod_string == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"tod_string\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_time_transfer\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.time_transfer.tod_string, this->u.time_transfer.tod_string_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_PROPAGATION_PARAMETERS:
            {
                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.propagation_parameters.ndown))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.propagation_parameters.nup))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RTT:
            {
                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.rtt.rtt))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_DAC_CONFIGURATION:
            {
                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.dac_configuration.stag))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.dac_configuration.ctag))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_DAC_CONFIGURATION_ENABLE_DISABLE:
            {
                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.dac_configuration_enable_disable.lldp_instance_status))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAME_BROADCAST:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.rx_frame_broadcast.rx_broadcast_frames))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_FRAMES_BROADCAST:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.tx_frames_broadcast.tx_broadcast_frames))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_FRAMES_MULTICAST:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.tx_frames_multicast.tx_multicast_frames))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAMES_MULTICAST:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.rx_frames_multicast.rx_multicast_frames))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_BYTES_GREEN:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.tx_bytes_green.tx_bytes_green))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_BYTES_GREEN:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.rx_bytes_green.rx_bytes_green))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_ONU_MCAST_LLID:
            {
                if (!bcmolt_epon_oam_u16_list_u8_pack(&this->u.onu_mcast_llid.llid_value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_UNI_MAC_LEARNED:
            {
                if (!bcmolt_epon_oam_buf_write_mac_address(buf, this->u.uni_mac_learned.mac_address))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.uni_mac_learned.uni_port))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_UNI_MAC_TABLE_FULL_BEHAVIOR:
            {
                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.uni_mac_table_full_behavior.over_write))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_ONU_PWR_SAVING_CAP:
            {
                if (!bcmolt_epon_oam_dpoe_power_saving_mode_pack(this->u.onu_pwr_saving_cap.pwr_saving_mode, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.onu_pwr_saving_cap.early_wake_up_support))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_pwr_saving_cap.ven_spec_field_size))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.onu_pwr_saving_cap.ven_spec_field_size > 0) && (this->u.onu_pwr_saving_cap.ven_spec_field == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"ven_spec_field\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_onu_pwr_saving_cap\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.onu_pwr_saving_cap.ven_spec_field, this->u.onu_pwr_saving_cap.ven_spec_field_size))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_DAC_CONFIGURATION_FLAGS:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_DAC_PASSWORD_CHALLENGE:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_ENERGY_EFFICIENT_ETHERNET_STATUS:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_L2CP_FRAMES_DISCARDED:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_L2CP_FRAMES_RX:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_L2CP_FRAMES_TX:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_L2CP_OCTETS_DISCARDED:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_L2CP_OCTETS_RX:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_L2CP_OCTETS_TX:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_LINE_RATE_MODE:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_MEDIA_TYPE:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_NUMBER_OF_PROGRAMMABLE_COUNTERS:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_ONU_MAX_FRAME_SIZE_CAPABILITY:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_PWR_OVER_ETHERNET_STATUS:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_BYTES_YELLOW:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAMES_UNICAST:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAMES_YELLOW:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_L2ERRORS:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_BYTES_YELLOW:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_FRAMES_UNICAST:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_FRAMES_YELLOW:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_L2ERRORS:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_UNI_MAX_FRAME_SIZE_LIMIT:
        default:
            {
                if ((this->u.def.unknown_count > 0) && (this->u.def.unknown == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"unknown\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_def\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.def.unknown, this->u.def.unknown_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
    if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dpoe_attribute_value_base_get_packed_length(bcmolt_epon_oam_dpoe_attribute_value_base *this)
{
    if (this->width >= 0x0080)
    {
        return this->width;
    }
    else
    {
        uint32_t count = 3;
        switch (this->leaf)
        {
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_SEQUENCE_NUMBER:
                {
                    count += 2;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_ONU_ID:
                {
                    count += 6;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_FIRMWARE_INFO:
                {
                    count += 12;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_CHIP_INFO:
                {
                    count += 10;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_DATE_OF_MANUFACTURE:
                {
                    count += 4;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_MANUFACTURER_INFO:
                {
                    count += this->u.manufacturer_info.def_count;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_MAX_LOGICAL_LINKS:
                {
                    count += 4;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_NUM_EPON_PORTS:
                {
                    count += 2;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_NUM_UNI_PORTS:
                {
                    count += 2;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_PACKET_BUFFER:
                {
                    count += 12;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_REPORT_THRESHOLDS:
                {
                    count += (((2 + (2 * this->u.report_thresholds.report_values_per_queue_set)) + (2 * this->u.report_thresholds.report_values_per_queue_set)) + (2 * this->u.report_thresholds.report_values_per_queue_set)) + (2 * this->u.report_thresholds.report_values_per_queue_set);
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_LINK_STATE:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_OAM_RATE:
                {
                    count += 2;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_DYN_LEARN_TABLE_SIZE:
                {
                    count += 2;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_DYN_LEARN_AGE_LIMIT:
                {
                    count += 2;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_DYN_MAC_TABLE:
                {
                    count += bcmolt_epon_oam_dpoe_mac_table_get_packed_length(&this->u.dyn_mac_table.mac_address);
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_STATIC_MAC_TABLE:
                {
                    count += bcmolt_epon_oam_dpoe_mac_table_get_packed_length(&this->u.static_mac_table.mac_address);
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_PORT_CAPABILITY:
                {
                    count += 4;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_DYN_LEARN_MODE:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_MIN_MAC_LIMIT:
                {
                    count += 2;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_MAX_MAC_ALLOWED:
                {
                    count += 2;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_AGG_MAC_LIMIT:
                {
                    count += 2;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_LEN_ERR_DISCARD:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_FLOOD_UNKNOWN:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_LOCAL_SWITCHING:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_QUEUE_CONFIG:
                {
                    uint32_t i0;
                    uint32_t i1;
                    count += 2;
                    if ((this->u.queue_config.number_of_links > 0) && (this->u.queue_config.link_configuration == NULL))
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"number_of_links\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return 0;
                    }

                    for (i0 = 0; i0 < this->u.queue_config.number_of_links; i0++)
                    {
                        count += bcmolt_epon_oam_dpoe_queue_set_get_packed_length(&this->u.queue_config.link_configuration[i0]);
                    }

                    if ((this->u.queue_config.number_of_ports > 0) && (this->u.queue_config.port_configuration == NULL))
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"number_of_ports\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return 0;
                    }

                    for (i1 = 0; i1 < this->u.queue_config.number_of_ports; i1++)
                    {
                        count += bcmolt_epon_oam_dpoe_queue_set_get_packed_length(&this->u.queue_config.port_configuration[i1]);
                    }
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_FIRMWARE_FILENAME:
                {
                    count += (this->u.firmware_filename.firmware_filename_count + 1);
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_PORT_STAT_THRESH:
                {
                    count += bcmolt_epon_oam_dpoe_statistic_threshold_get_packed_length(&this->u.port_stat_thresh.stat_threshold);
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_LINK_STAT_THRESH:
                {
                    count += bcmolt_epon_oam_dpoe_statistic_threshold_get_packed_length(&this->u.link_stat_thresh.stat_threshold);
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_KEY_EXPIRY_TIME:
                {
                    count += 2;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_ENCRYPT_MODE:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_PORT_INGRESS_RULE:
                {
                    count += bcmolt_epon_oam_dpoe_rule_get_packed_length(&this->u.port_ingress_rule.rule);
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_LUE_FIELD:
                {
                    count += 6;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_ALT_CVLAN_ETHERTYPE:
                {
                    count += 3;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_ALT_SVLAN_ETHERTYPE:
                {
                    count += 3;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_BC_RATE_LIMIT:
                {
                    count += 4;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_EGRESS_SHAPING:
                {
                    count += 3 + (7 * this->u.egress_shaping.number_of_shapers);
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_INGRESS_POLICING:
                {
                    count += 2 + (5 * this->u.ingress_policing.number_of_rate_levels);
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_FEC_MODE:
                {
                    count += 2;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_MFR_NAME:
                {
                    count += this->u.mfr_name.man_name_count;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_FWARE_MFG_TIME_VAR_CTRL:
                {
                    count += 26;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_VENDOR_NAME:
                {
                    count += this->u.vendor_name.vendor_name_count;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_MODEL_NUMBER:
                {
                    count += this->u.model_number.model_number_count;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_HW_VERSION:
                {
                    count += this->u.hw_version.hw_version_count;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_OPT_MON_TEMPERATURE:
                {
                    count += (2 * this->u.opt_mon_temperature.current_temperature_count);
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_OPT_MON_VCC:
                {
                    count += (2 * this->u.opt_mon_vcc.current_vcc_count);
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_OPT_MON_TX_BIAS:
                {
                    count += (2 * this->u.opt_mon_tx_bias.current_tx_bias_count);
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_OPT_MON_TX_POWER:
                {
                    count += (2 * this->u.opt_mon_tx_power.current_tx_power_count);
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_OPT_MON_RX_POWER:
                {
                    count += (2 * this->u.opt_mon_rx_power.current_rx_power_count);
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_UNICAST_FRAMES:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_UNICAST_FRAMES:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAME_TOO_SHORT:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAME64:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAME65127:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAME128255:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAME256511:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAME5121023:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAME10241518:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAME1519PLUS:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_FRAME64:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_FRAME65127:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_FRAME128255:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_FRAME256511:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_FRAME5121023:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_FRAME10241518:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_FRAME1519PLUS:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_QUEUE_DELAY_THRESH:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_QUEUE_DELAY:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_FRAMES_DROPPED:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_BYTES_DROPPED:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_BYTES_DELAYED:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_BYTES_UNUSED:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_DONU_PORT_TYPE:
                {
                    count += this->u.donu_port_type.port_type_count;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_SUSPEND_RESUME_ALARM_REPORTING:
                {
                    count += (2 * this->u.suspend_resume_alarm_reporting.def_count);
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_IPMC_FORWARDING_RULE_CONFIGURATION:
                {
                    count += 2;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_ITPID:
                {
                    count += 3;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_BTPID:
                {
                    count += 3;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_QUEUE_CIR:
                {
                    count += 6;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_QUEUE_EIR:
                {
                    count += 6;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_QUEUE_COLOR_MARKING:
                {
                    count += 7;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_QUEUE_RATE_LIMITER_CAPABILITIES:
                {
                    count += 15;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_COUPLING_FLAG:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_CLOCK_TRANSPORT_CAPABILITIES:
                {
                    count += 3;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_ENABLE_CLOCK_TRANSPORT:
                {
                    count += 3;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TIME_TRANSFER:
                {
                    count += 4 + this->u.time_transfer.tod_string_count;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_PROPAGATION_PARAMETERS:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RTT:
                {
                    count += 4;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_DAC_CONFIGURATION:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_DAC_CONFIGURATION_ENABLE_DISABLE:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAME_BROADCAST:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_FRAMES_BROADCAST:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_FRAMES_MULTICAST:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAMES_MULTICAST:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_BYTES_GREEN:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_BYTES_GREEN:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_ONU_MCAST_LLID:
                {
                    count += bcmolt_epon_oam_u16_list_u8_get_packed_length(&this->u.onu_mcast_llid.llid_value);
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_UNI_MAC_LEARNED:
                {
                    count += 7;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_UNI_MAC_TABLE_FULL_BEHAVIOR:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_ONU_PWR_SAVING_CAP:
                {
                    count += 3 + this->u.onu_pwr_saving_cap.ven_spec_field_size;
                }
                break;
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_DAC_CONFIGURATION_FLAGS:
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_DAC_PASSWORD_CHALLENGE:
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_ENERGY_EFFICIENT_ETHERNET_STATUS:
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_L2CP_FRAMES_DISCARDED:
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_L2CP_FRAMES_RX:
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_L2CP_FRAMES_TX:
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_L2CP_OCTETS_DISCARDED:
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_L2CP_OCTETS_RX:
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_L2CP_OCTETS_TX:
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_LINE_RATE_MODE:
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_MEDIA_TYPE:
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_NUMBER_OF_PROGRAMMABLE_COUNTERS:
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_ONU_MAX_FRAME_SIZE_CAPABILITY:
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_PWR_OVER_ETHERNET_STATUS:
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_BYTES_YELLOW:
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAMES_UNICAST:
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAMES_YELLOW:
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_L2ERRORS:
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_BYTES_YELLOW:
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_FRAMES_UNICAST:
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_FRAMES_YELLOW:
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_L2ERRORS:
            case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_UNI_MAX_FRAME_SIZE_LIMIT:
            default:
                {
                    count += this->u.def.unknown_count;
                }
                break;
        }

        return count;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_attribute_value_base_unpack(bcmolt_epon_oam_dpoe_attribute_value_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    bcmolt_epon_oam_buf postLenBuf;
    if (!bcmolt_epon_oam_dpoe_leaf_attribute_unpack(&this->leaf, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->width))
    {
        return BCMOS_FALSE;
    }

    if (this->width >= 0x0080)
    {
        return BCMOS_TRUE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, (this->width == 0) ? 0x0080 : this->width, buf->curr);
    switch (this->leaf)
    {
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_SEQUENCE_NUMBER:
            {
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.sequence_number.sequnce_number))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_ONU_ID:
            {
                if (!bcmolt_epon_oam_buf_read_mac_address(&postLenBuf, &this->u.onu_id.id))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_FIRMWARE_INFO:
            {
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.firmware_info.boot_version))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.firmware_info.boot_crc32))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.firmware_info.application_version))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.firmware_info.application_crc32))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_CHIP_INFO:
            {
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.chip_info.jedec_id))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.chip_info.chip_model))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.chip_info.chip_version))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_DATE_OF_MANUFACTURE:
            {
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.date_of_manufacture.year))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.date_of_manufacture.month))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.date_of_manufacture.day))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_MANUFACTURER_INFO:
            {
                this->u.manufacturer_info.def_count = bcmolt_epon_oam_dpoe_attribute_value_base_manufacturer_info_count_def(&postLenBuf);
                if ((this->u.manufacturer_info.def_count > 0) && (this->u.manufacturer_info.def == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"def\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_manufacturer_info\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.manufacturer_info.def = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.manufacturer_info.def_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.manufacturer_info.def, this->u.manufacturer_info.def_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_MAX_LOGICAL_LINKS:
            {
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.max_logical_links.bidirectional))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.max_logical_links.downstream_only))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_NUM_EPON_PORTS:
            {
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.num_epon_ports.port_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_NUM_UNI_PORTS:
            {
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.num_uni_ports.port_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_PACKET_BUFFER:
            {
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.packet_buffer.upstream_queues))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.packet_buffer.up_queues_max_per_link))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.packet_buffer.up_queue_increment))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.packet_buffer.downstream_queues))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.packet_buffer.dn_queues_max_per_port))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.packet_buffer.dn_queue_increment))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.packet_buffer.total_packet_buffer))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.packet_buffer.upstream_packet_buffer))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.packet_buffer.downsream_packet_buffer))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_REPORT_THRESHOLDS:
            {
                uint8_t i0;
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.report_thresholds.number_of_queue_sets))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.report_thresholds.report_values_per_queue_set))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.report_thresholds.report_values_per_queue_set > 0) && (this->u.report_thresholds.queue_set0 == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"queue_set0\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_report_thresholds\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.report_thresholds.queue_set0 = (uint16_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.report_thresholds.report_values_per_queue_set * sizeof(uint16_t));
                    }
                }

                for (i0 = 0; i0 < this->u.report_thresholds.report_values_per_queue_set; i0++)
                {
                    if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.report_thresholds.queue_set0[i0]))
                    {
                        return BCMOS_FALSE;
                    }
                }

                if (((uint64_t) this->u.report_thresholds.number_of_queue_sets > 0x0001))
                {
                    if ((this->u.report_thresholds.report_values_per_queue_set > 0) && (this->u.report_thresholds.queue_set1 == NULL))
                    {
                        if (extra_mem == NULL)
                        {
                            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"queue_set1\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_report_thresholds\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                            return BCMOS_FALSE;
                        }
                        else
                        {
                            this->u.report_thresholds.queue_set1 = (uint16_t *) *extra_mem;
                            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.report_thresholds.report_values_per_queue_set * sizeof(uint16_t));
                        }
                    }

                    uint8_t i1;
                    for (i1 = 0; i1 < this->u.report_thresholds.report_values_per_queue_set; i1++)
                    {
                        if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.report_thresholds.queue_set1[i1]))
                        {
                            return BCMOS_FALSE;
                        }
                    }
                }

                if (((uint64_t) this->u.report_thresholds.number_of_queue_sets > 0x0002))
                {
                    if ((this->u.report_thresholds.report_values_per_queue_set > 0) && (this->u.report_thresholds.queue_set2 == NULL))
                    {
                        if (extra_mem == NULL)
                        {
                            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"queue_set2\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_report_thresholds\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                            return BCMOS_FALSE;
                        }
                        else
                        {
                            this->u.report_thresholds.queue_set2 = (uint16_t *) *extra_mem;
                            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.report_thresholds.report_values_per_queue_set * sizeof(uint16_t));
                        }
                    }

                    uint8_t i2;
                    for (i2 = 0; i2 < this->u.report_thresholds.report_values_per_queue_set; i2++)
                    {
                        if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.report_thresholds.queue_set2[i2]))
                        {
                            return BCMOS_FALSE;
                        }
                    }
                }

                if (((uint64_t) this->u.report_thresholds.number_of_queue_sets > 0x0003))
                {
                    if ((this->u.report_thresholds.report_values_per_queue_set > 0) && (this->u.report_thresholds.queue_set3 == NULL))
                    {
                        if (extra_mem == NULL)
                        {
                            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"queue_set3\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_report_thresholds\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                            return BCMOS_FALSE;
                        }
                        else
                        {
                            this->u.report_thresholds.queue_set3 = (uint16_t *) *extra_mem;
                            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.report_thresholds.report_values_per_queue_set * sizeof(uint16_t));
                        }
                    }

                    uint8_t i3;
                    for (i3 = 0; i3 < this->u.report_thresholds.report_values_per_queue_set; i3++)
                    {
                        if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.report_thresholds.queue_set3[i3]))
                        {
                            return BCMOS_FALSE;
                        }
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_LINK_STATE:
            {
                if (!bcmolt_epon_oam_dpoe_link_state_unpack(&this->u.link_state.link_state, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_OAM_RATE:
            {
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.oam_rate.maximum_oam_rate))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.oam_rate.minimum_oam_rate))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_DYN_LEARN_TABLE_SIZE:
            {
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.dyn_learn_table_size.max_mac_allowed))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_DYN_LEARN_AGE_LIMIT:
            {
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.dyn_learn_age_limit.dynamic_address_age_limit))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_DYN_MAC_TABLE:
            {
                if (!bcmolt_epon_oam_dpoe_mac_table_unpack(&this->u.dyn_mac_table.mac_address, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_STATIC_MAC_TABLE:
            {
                if (!bcmolt_epon_oam_dpoe_mac_table_unpack(&this->u.static_mac_table.mac_address, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_PORT_CAPABILITY:
            {
                if (!bcmolt_epon_oam_auto_negotiation_capability_unpack(&this->u.port_capability.maximum_capabilities, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_auto_negotiation_capability_unpack(&this->u.port_capability.current_capabilities, &postLenBuf))
                {
                    /*Optional unpack fails do not cause errors */
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_DYN_LEARN_MODE:
            {
                if (!bcmolt_epon_oam_dpoe_learning_mode_unpack(&this->u.dyn_learn_mode.learning_mode, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_MIN_MAC_LIMIT:
            {
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.min_mac_limit.minimum_guaranteed_limit))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_MAX_MAC_ALLOWED:
            {
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.max_mac_allowed.max_allowed))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_AGG_MAC_LIMIT:
            {
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.agg_mac_limit.aggregate_mac_limit))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_LEN_ERR_DISCARD:
            {
                if (!bcmolt_epon_oam_buf_read_bool(&postLenBuf, &this->u.len_err_discard.len_error_discard))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_FLOOD_UNKNOWN:
            {
                if (!bcmolt_epon_oam_buf_read_bool(&postLenBuf, &this->u.flood_unknown.flood_unknown))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_LOCAL_SWITCHING:
            {
                if (!bcmolt_epon_oam_buf_read_bool(&postLenBuf, &this->u.local_switching.local_switching))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_QUEUE_CONFIG:
            {
                uint8_t i4;
                uint8_t i5;
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.queue_config.number_of_links))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.queue_config.number_of_links > 0) && (this->u.queue_config.link_configuration == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"link_configuration\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_queue_config\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.queue_config.link_configuration = (bcmolt_epon_oam_dpoe_queue_set *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.queue_config.number_of_links * sizeof(bcmolt_epon_oam_dpoe_queue_set));
                    }
                }

                for (i4 = 0; i4 < this->u.queue_config.number_of_links; i4++)
                {
                    if (!bcmolt_epon_oam_dpoe_queue_set_unpack(&this->u.queue_config.link_configuration[i4], &postLenBuf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.queue_config.number_of_ports))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.queue_config.number_of_ports > 0) && (this->u.queue_config.port_configuration == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"port_configuration\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_queue_config\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.queue_config.port_configuration = (bcmolt_epon_oam_dpoe_queue_set *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.queue_config.number_of_ports * sizeof(bcmolt_epon_oam_dpoe_queue_set));
                    }
                }

                for (i5 = 0; i5 < this->u.queue_config.number_of_ports; i5++)
                {
                    if (!bcmolt_epon_oam_dpoe_queue_set_unpack(&this->u.queue_config.port_configuration[i5], &postLenBuf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_FIRMWARE_FILENAME:
            {
                this->u.firmware_filename.firmware_filename_count = bcmolt_epon_oam_dpoe_attribute_value_base_firmware_filename_count_firmware_filename(&postLenBuf);
                if ((this->u.firmware_filename.firmware_filename_count > 0) && (this->u.firmware_filename.firmware_filename == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"firmware_filename\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_firmware_filename\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.firmware_filename.firmware_filename = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.firmware_filename.firmware_filename_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.firmware_filename.firmware_filename, this->u.firmware_filename.firmware_filename_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_PORT_STAT_THRESH:
            {
                if (!bcmolt_epon_oam_dpoe_statistic_threshold_unpack(&this->u.port_stat_thresh.stat_threshold, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_LINK_STAT_THRESH:
            {
                if (!bcmolt_epon_oam_dpoe_statistic_threshold_unpack(&this->u.link_stat_thresh.stat_threshold, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_KEY_EXPIRY_TIME:
            {
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.key_expiry_time.time))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_ENCRYPT_MODE:
            {
                if (!bcmolt_epon_oam_dpoe_encryption_mode_unpack(&this->u.encrypt_mode.encryption_method, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_PORT_INGRESS_RULE:
            {
                if (!bcmolt_epon_oam_dpoe_rule_unpack(&this->u.port_ingress_rule.rule, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_LUE_FIELD:
            {
                if (!bcmolt_epon_oam_dpoe_field_code_unpack(&this->u.lue_field.field_code, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_dpoe_layer_select_unpack(&this->u.lue_field.layer_select, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.lue_field.bit_word_offset))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.lue_field.bit_offset))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.lue_field.bit_width))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.lue_field.reference_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_ALT_CVLAN_ETHERTYPE:
            {
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.alt_cvlan_ethertype.tpid))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_bool(&postLenBuf, &this->u.alt_cvlan_ethertype.insert))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_ALT_SVLAN_ETHERTYPE:
            {
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.alt_svlan_ethertype.tpid))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_bool(&postLenBuf, &this->u.alt_svlan_ethertype.insert))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_BC_RATE_LIMIT:
            {
                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.bc_rate_limit.limit))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_EGRESS_SHAPING:
            {
                uint8_t i6;
                if (!bcmolt_epon_oam_traffic_bitmap_unpack(&this->u.egress_shaping.traffic_types, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_rate_units_unpack(&this->u.egress_shaping.rate_units, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.egress_shaping.number_of_shapers))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.egress_shaping.number_of_shapers > 0) && (this->u.egress_shaping.shapers == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"shapers\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_egress_shaping\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.egress_shaping.shapers = (bcmolt_epon_oam_dpoe_shaper *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.egress_shaping.number_of_shapers * sizeof(bcmolt_epon_oam_dpoe_shaper));
                    }
                }

                for (i6 = 0; i6 < this->u.egress_shaping.number_of_shapers; i6++)
                {
                    if (!bcmolt_epon_oam_dpoe_shaper_unpack(&this->u.egress_shaping.shapers[i6], &postLenBuf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_INGRESS_POLICING:
            {
                uint8_t i7;
                if (!bcmolt_epon_oam_rate_units_unpack(&this->u.ingress_policing.rate_units, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.ingress_policing.number_of_rate_levels))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.ingress_policing.number_of_rate_levels > 0) && (this->u.ingress_policing.rate_levels == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"rate_levels\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_ingress_policing\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.ingress_policing.rate_levels = (bcmolt_epon_oam_dpoe_rate_level *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.ingress_policing.number_of_rate_levels * sizeof(bcmolt_epon_oam_dpoe_rate_level));
                    }
                }

                for (i7 = 0; i7 < this->u.ingress_policing.number_of_rate_levels; i7++)
                {
                    if (!bcmolt_epon_oam_dpoe_rate_level_unpack(&this->u.ingress_policing.rate_levels[i7], &postLenBuf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_FEC_MODE:
            {
                if (!bcmolt_epon_oam_dpoe_fec_mode_unpack(&this->u.fec_mode.rx_down, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_dpoe_fec_mode_unpack(&this->u.fec_mode.tx_up, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_MFR_NAME:
            {
                this->u.mfr_name.man_name_count = bcmolt_epon_oam_dpoe_attribute_value_base_mfr_name_count_man_name(&postLenBuf);
                if ((this->u.mfr_name.man_name_count > 0) && (this->u.mfr_name.man_name == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"man_name\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_mfr_name\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.mfr_name.man_name = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.mfr_name.man_name_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.mfr_name.man_name, this->u.mfr_name.man_name_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_FWARE_MFG_TIME_VAR_CTRL:
            {
                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.fware_mfg_time_var_ctrl.code_access_start, 13))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.fware_mfg_time_var_ctrl.cvc_access_start, 13))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_VENDOR_NAME:
            {
                this->u.vendor_name.vendor_name_count = bcmolt_epon_oam_dpoe_attribute_value_base_vendor_name_count_vendor_name(&postLenBuf);
                if ((this->u.vendor_name.vendor_name_count > 0) && (this->u.vendor_name.vendor_name == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vendor_name\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_vendor_name\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.vendor_name.vendor_name = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.vendor_name.vendor_name_count * sizeof(uint8_t));
                    }
                }

                if (this->u.vendor_name.vendor_name_count > 31)
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.vendor_name.vendor_name, this->u.vendor_name.vendor_name_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_MODEL_NUMBER:
            {
                this->u.model_number.model_number_count = bcmolt_epon_oam_dpoe_attribute_value_base_model_number_count_model_number(&postLenBuf);
                if ((this->u.model_number.model_number_count > 0) && (this->u.model_number.model_number == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"model_number\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_model_number\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.model_number.model_number = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.model_number.model_number_count * sizeof(uint8_t));
                    }
                }

                if (this->u.model_number.model_number_count > 31)
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.model_number.model_number, this->u.model_number.model_number_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_HW_VERSION:
            {
                this->u.hw_version.hw_version_count = bcmolt_epon_oam_dpoe_attribute_value_base_hw_version_count_hw_version(&postLenBuf);
                if ((this->u.hw_version.hw_version_count > 0) && (this->u.hw_version.hw_version == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"hw_version\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_hw_version\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.hw_version.hw_version = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.hw_version.hw_version_count * sizeof(uint8_t));
                    }
                }

                if (this->u.hw_version.hw_version_count > 31)
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.hw_version.hw_version, this->u.hw_version.hw_version_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_OPT_MON_TEMPERATURE:
            {
                uint32_t i8;
                this->u.opt_mon_temperature.current_temperature_count = bcmolt_epon_oam_dpoe_attribute_value_base_opt_mon_temperature_count_current_temperature(&postLenBuf);
                if ((this->u.opt_mon_temperature.current_temperature_count > 0) && (this->u.opt_mon_temperature.current_temperature == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"current_temperature\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_opt_mon_temperature\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.opt_mon_temperature.current_temperature = (uint16_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.opt_mon_temperature.current_temperature_count * sizeof(uint16_t));
                    }
                }

                if (this->u.opt_mon_temperature.current_temperature_count > 4)
                {
                    return BCMOS_FALSE;
                }

                for (i8 = 0; i8 < this->u.opt_mon_temperature.current_temperature_count; i8++)
                {
                    if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.opt_mon_temperature.current_temperature[i8]))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_OPT_MON_VCC:
            {
                uint32_t i9;
                this->u.opt_mon_vcc.current_vcc_count = bcmolt_epon_oam_dpoe_attribute_value_base_opt_mon_vcc_count_current_vcc(&postLenBuf);
                if ((this->u.opt_mon_vcc.current_vcc_count > 0) && (this->u.opt_mon_vcc.current_vcc == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"current_vcc\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_opt_mon_vcc\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.opt_mon_vcc.current_vcc = (uint16_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.opt_mon_vcc.current_vcc_count * sizeof(uint16_t));
                    }
                }

                if (this->u.opt_mon_vcc.current_vcc_count > 4)
                {
                    return BCMOS_FALSE;
                }

                for (i9 = 0; i9 < this->u.opt_mon_vcc.current_vcc_count; i9++)
                {
                    if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.opt_mon_vcc.current_vcc[i9]))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_OPT_MON_TX_BIAS:
            {
                uint32_t i10;
                this->u.opt_mon_tx_bias.current_tx_bias_count = bcmolt_epon_oam_dpoe_attribute_value_base_opt_mon_tx_bias_count_current_tx_bias(&postLenBuf);
                if ((this->u.opt_mon_tx_bias.current_tx_bias_count > 0) && (this->u.opt_mon_tx_bias.current_tx_bias == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"current_tx_bias\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_opt_mon_tx_bias\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.opt_mon_tx_bias.current_tx_bias = (uint16_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.opt_mon_tx_bias.current_tx_bias_count * sizeof(uint16_t));
                    }
                }

                if (this->u.opt_mon_tx_bias.current_tx_bias_count > 4)
                {
                    return BCMOS_FALSE;
                }

                for (i10 = 0; i10 < this->u.opt_mon_tx_bias.current_tx_bias_count; i10++)
                {
                    if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.opt_mon_tx_bias.current_tx_bias[i10]))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_OPT_MON_TX_POWER:
            {
                uint32_t i11;
                this->u.opt_mon_tx_power.current_tx_power_count = bcmolt_epon_oam_dpoe_attribute_value_base_opt_mon_tx_power_count_current_tx_power(&postLenBuf);
                if ((this->u.opt_mon_tx_power.current_tx_power_count > 0) && (this->u.opt_mon_tx_power.current_tx_power == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"current_tx_power\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_opt_mon_tx_power\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.opt_mon_tx_power.current_tx_power = (uint16_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.opt_mon_tx_power.current_tx_power_count * sizeof(uint16_t));
                    }
                }

                if (this->u.opt_mon_tx_power.current_tx_power_count > 4)
                {
                    return BCMOS_FALSE;
                }

                for (i11 = 0; i11 < this->u.opt_mon_tx_power.current_tx_power_count; i11++)
                {
                    if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.opt_mon_tx_power.current_tx_power[i11]))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_OPT_MON_RX_POWER:
            {
                uint32_t i12;
                this->u.opt_mon_rx_power.current_rx_power_count = bcmolt_epon_oam_dpoe_attribute_value_base_opt_mon_rx_power_count_current_rx_power(&postLenBuf);
                if ((this->u.opt_mon_rx_power.current_rx_power_count > 0) && (this->u.opt_mon_rx_power.current_rx_power == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"current_rx_power\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_opt_mon_rx_power\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.opt_mon_rx_power.current_rx_power = (uint16_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.opt_mon_rx_power.current_rx_power_count * sizeof(uint16_t));
                    }
                }

                if (this->u.opt_mon_rx_power.current_rx_power_count > 4)
                {
                    return BCMOS_FALSE;
                }

                for (i12 = 0; i12 < this->u.opt_mon_rx_power.current_rx_power_count; i12++)
                {
                    if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.opt_mon_rx_power.current_rx_power[i12]))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_UNICAST_FRAMES:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.rx_unicast_frames.rx_unicast_frames))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_UNICAST_FRAMES:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.tx_unicast_frames.tx_unicast_frames))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAME_TOO_SHORT:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.rx_frame_too_short.rx_frames_too_short))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAME64:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.rx_frame64.rx_frames64))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAME65127:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.rx_frame65127.rx_frames65127))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAME128255:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.rx_frame128255.rx_frames128255))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAME256511:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.rx_frame256511.rx_frames256511))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAME5121023:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.rx_frame5121023.rx_frames5121023))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAME10241518:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.rx_frame10241518.rx_frames10241518))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAME1519PLUS:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.rx_frame1519plus.rx_frames1519plus))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_FRAME64:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.tx_frame64.tx_frames64))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_FRAME65127:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.tx_frame65127.tx_frames65127))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_FRAME128255:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.tx_frame128255.tx_frames128255))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_FRAME256511:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.tx_frame256511.tx_frames256511))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_FRAME5121023:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.tx_frame5121023.tx_frames5121023))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_FRAME10241518:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.tx_frame10241518.tx_frames10241518))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_FRAME1519PLUS:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.tx_frame1519plus.tx_frames1519plus))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_QUEUE_DELAY_THRESH:
            {
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.queue_delay_thresh.queue_delay_threshold))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_QUEUE_DELAY:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.queue_delay.queue_delay))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_FRAMES_DROPPED:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.frames_dropped.frames_dropped))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_BYTES_DROPPED:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.bytes_dropped.bytes_dropped))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_BYTES_DELAYED:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.bytes_delayed.bytes_delayed))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_BYTES_UNUSED:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.tx_bytes_unused.tx_bytes_unused))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_DONU_PORT_TYPE:
            {
                uint32_t i13;
                this->u.donu_port_type.port_type_count = bcmolt_epon_oam_dpoe_attribute_value_base_donu_port_type_count_port_type(&postLenBuf);
                if ((this->u.donu_port_type.port_type_count > 0) && (this->u.donu_port_type.port_type == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"port_type\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_donu_port_type\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.donu_port_type.port_type = (bcmolt_epon_oam_dpoe_port_type *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.donu_port_type.port_type_count * sizeof(bcmolt_epon_oam_dpoe_port_type));
                    }
                }

                for (i13 = 0; i13 < this->u.donu_port_type.port_type_count; i13++)
                {
                    if (!bcmolt_epon_oam_dpoe_port_type_unpack(&this->u.donu_port_type.port_type[i13], &postLenBuf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_SUSPEND_RESUME_ALARM_REPORTING:
            {
                uint32_t i14;
                this->u.suspend_resume_alarm_reporting.def_count = bcmolt_epon_oam_dpoe_attribute_value_base_suspend_resume_alarm_reporting_count_def(&postLenBuf);
                if ((this->u.suspend_resume_alarm_reporting.def_count > 0) && (this->u.suspend_resume_alarm_reporting.def == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"def\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_suspend_resume_alarm_reporting\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.suspend_resume_alarm_reporting.def = (bcmolt_epon_oam_dpoe_event_options *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.suspend_resume_alarm_reporting.def_count * sizeof(bcmolt_epon_oam_dpoe_event_options));
                    }
                }

                for (i14 = 0; i14 < this->u.suspend_resume_alarm_reporting.def_count; i14++)
                {
                    if (!bcmolt_epon_oam_dpoe_event_options_unpack(&this->u.suspend_resume_alarm_reporting.def[i14], &postLenBuf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_IPMC_FORWARDING_RULE_CONFIGURATION:
            {
                if (!bcmolt_epon_oam_dpoe_ipmc_forwarding_flags_unpack(&this->u.ipmc_forwarding_rule_configuration.field_bitmap, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_ITPID:
            {
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.itpid.alternate_itpid))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_bool(&postLenBuf, &this->u.itpid.insert_this_tpid))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_BTPID:
            {
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.btpid.alternate_btpid))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_bool(&postLenBuf, &this->u.btpid.insert_this_tpid))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_QUEUE_CIR:
            {
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.queue_cir.commited_burst_size))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.queue_cir.commited_information_rate))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_QUEUE_EIR:
            {
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.queue_eir.excess_burst_size))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.queue_eir.queue_eir))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_QUEUE_COLOR_MARKING:
            {
                if (!bcmolt_epon_oam_buf_read_bool(&postLenBuf, &this->u.queue_color_marking.enable_color_marking))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.queue_color_marking.field_code))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.queue_color_marking.field_instance))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.queue_color_marking.msb_mask))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.queue_color_marking.lsb_mask))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.queue_color_marking.green_value))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.queue_color_marking.yellow_value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_QUEUE_RATE_LIMITER_CAPABILITIES:
            {
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.queue_rate_limiter_capabilities.number_of_rate_limiters))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.queue_rate_limiter_capabilities.cbs_min_increment))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.queue_rate_limiter_capabilities.cir_min_increment))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.queue_rate_limiter_capabilities.ebs_min_increment))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.queue_rate_limiter_capabilities.eir_min_increment))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.queue_rate_limiter_capabilities.color_aware))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.queue_rate_limiter_capabilities.coupling_configurable))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.queue_rate_limiter_capabilities.coupling_behaviro_default))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.queue_rate_limiter_capabilities.color_marking_support))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.queue_rate_limiter_capabilities.smart_color_drop))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_COUPLING_FLAG:
            {
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.coupling_flag.coupling_flag))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_CLOCK_TRANSPORT_CAPABILITIES:
            {
                if (!bcmolt_epon_oam_buf_read_bool(&postLenBuf, &this->u.clock_transport_capabilities.pps_pulse_support))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_bool(&postLenBuf, &this->u.clock_transport_capabilities.tod_string_support))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_bool(&postLenBuf, &this->u.clock_transport_capabilities.v2frame_support))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_ENABLE_CLOCK_TRANSPORT:
            {
                if (!bcmolt_epon_oam_buf_read_bool(&postLenBuf, &this->u.enable_clock_transport.pps_pulse_output))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_bool(&postLenBuf, &this->u.enable_clock_transport.tod_string_output))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_bool(&postLenBuf, &this->u.enable_clock_transport.v2frame_output))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TIME_TRANSFER:
            {
                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.time_transfer.mpcp_reference_point))
                {
                    return BCMOS_FALSE;
                }

                this->u.time_transfer.tod_string_count = bcmolt_epon_oam_dpoe_attribute_value_base_time_transfer_count_tod_string(&postLenBuf);
                if ((this->u.time_transfer.tod_string_count > 0) && (this->u.time_transfer.tod_string == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"tod_string\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_time_transfer\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.time_transfer.tod_string = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.time_transfer.tod_string_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.time_transfer.tod_string, this->u.time_transfer.tod_string_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_PROPAGATION_PARAMETERS:
            {
                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.propagation_parameters.ndown))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.propagation_parameters.nup))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RTT:
            {
                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.rtt.rtt))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_DAC_CONFIGURATION:
            {
                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.dac_configuration.stag))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.dac_configuration.ctag))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_DAC_CONFIGURATION_ENABLE_DISABLE:
            {
                if (!bcmolt_epon_oam_buf_read_bool(&postLenBuf, &this->u.dac_configuration_enable_disable.lldp_instance_status))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAME_BROADCAST:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.rx_frame_broadcast.rx_broadcast_frames))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_FRAMES_BROADCAST:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.tx_frames_broadcast.tx_broadcast_frames))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_FRAMES_MULTICAST:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.tx_frames_multicast.tx_multicast_frames))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAMES_MULTICAST:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.rx_frames_multicast.rx_multicast_frames))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_BYTES_GREEN:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.tx_bytes_green.tx_bytes_green))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_BYTES_GREEN:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.rx_bytes_green.rx_bytes_green))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_ONU_MCAST_LLID:
            {
                if (!bcmolt_epon_oam_u16_list_u8_unpack(&this->u.onu_mcast_llid.llid_value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_UNI_MAC_LEARNED:
            {
                if (!bcmolt_epon_oam_buf_read_mac_address(&postLenBuf, &this->u.uni_mac_learned.mac_address))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.uni_mac_learned.uni_port))
                {
                    /*Optional unpack fails do not cause errors */
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_UNI_MAC_TABLE_FULL_BEHAVIOR:
            {
                if (!bcmolt_epon_oam_buf_read_bool(&postLenBuf, &this->u.uni_mac_table_full_behavior.over_write))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_ONU_PWR_SAVING_CAP:
            {
                if (!bcmolt_epon_oam_dpoe_power_saving_mode_unpack(&this->u.onu_pwr_saving_cap.pwr_saving_mode, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_bool(&postLenBuf, &this->u.onu_pwr_saving_cap.early_wake_up_support))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.onu_pwr_saving_cap.ven_spec_field_size))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.onu_pwr_saving_cap.ven_spec_field_size > 0) && (this->u.onu_pwr_saving_cap.ven_spec_field == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"ven_spec_field\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_onu_pwr_saving_cap\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.onu_pwr_saving_cap.ven_spec_field = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.onu_pwr_saving_cap.ven_spec_field_size * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.onu_pwr_saving_cap.ven_spec_field, this->u.onu_pwr_saving_cap.ven_spec_field_size))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_DAC_CONFIGURATION_FLAGS:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_DAC_PASSWORD_CHALLENGE:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_ENERGY_EFFICIENT_ETHERNET_STATUS:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_L2CP_FRAMES_DISCARDED:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_L2CP_FRAMES_RX:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_L2CP_FRAMES_TX:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_L2CP_OCTETS_DISCARDED:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_L2CP_OCTETS_RX:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_L2CP_OCTETS_TX:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_LINE_RATE_MODE:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_MEDIA_TYPE:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_NUMBER_OF_PROGRAMMABLE_COUNTERS:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_ONU_MAX_FRAME_SIZE_CAPABILITY:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_PWR_OVER_ETHERNET_STATUS:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_BYTES_YELLOW:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAMES_UNICAST:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAMES_YELLOW:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_L2ERRORS:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_BYTES_YELLOW:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_FRAMES_UNICAST:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_FRAMES_YELLOW:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_L2ERRORS:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_UNI_MAX_FRAME_SIZE_LIMIT:
        default:
            {
                this->u.def.unknown_count = bcmolt_epon_oam_dpoe_attribute_value_base_def_count_unknown(&postLenBuf);
                if ((this->u.def.unknown_count > 0) && (this->u.def.unknown == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"unknown\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_base_def\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.def.unknown = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.def.unknown_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.def.unknown, this->u.def.unknown_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(buf, (this->width == 0) ? 0x0080 : this->width))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_attribute_value_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_dpoe_leaf_attribute leaf;
    bcmolt_epon_oam_buf postLenBuf;
    uint8_t length;
    if (!bcmolt_epon_oam_dpoe_leaf_attribute_unpack(&leaf, packed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
    {
        return BCMOS_FALSE;
    }

    if (length >= 0x0080)
    {
        return BCMOS_TRUE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
    switch (leaf)
    {
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_SEQUENCE_NUMBER:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_ONU_ID:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 6))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_FIRMWARE_INFO:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_CHIP_INFO:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_DATE_OF_MANUFACTURE:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_MANUFACTURER_INFO:
            {
                uint32_t default_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                    {
                        break;
                    }

                    default_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(default_elem_count * sizeof(uint8_t));
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_MAX_LOGICAL_LINKS:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_NUM_EPON_PORTS:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_NUM_UNI_PORTS:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_PACKET_BUFFER:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_REPORT_THRESHOLDS:
            {
                uint8_t report_values_per_queue_set;
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &report_values_per_queue_set))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint16_t) * report_values_per_queue_set);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, report_values_per_queue_set * 2))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint16_t) * report_values_per_queue_set);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, report_values_per_queue_set * 2))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint16_t) * report_values_per_queue_set);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, report_values_per_queue_set * 2))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint16_t) * report_values_per_queue_set);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, report_values_per_queue_set * 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_LINK_STATE:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_OAM_RATE:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_DYN_LEARN_TABLE_SIZE:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_DYN_LEARN_AGE_LIMIT:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_DYN_MAC_TABLE:
            {
                if (!bcmolt_epon_oam_dpoe_mac_table_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_STATIC_MAC_TABLE:
            {
                if (!bcmolt_epon_oam_dpoe_mac_table_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_PORT_CAPABILITY:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    /*Optional unpack fails do not cause errors */
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_DYN_LEARN_MODE:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_MIN_MAC_LIMIT:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_MAX_MAC_ALLOWED:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_AGG_MAC_LIMIT:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_LEN_ERR_DISCARD:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_FLOOD_UNKNOWN:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_LOCAL_SWITCHING:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_QUEUE_CONFIG:
            {
                uint8_t number_of_links;
                uint8_t i0;
                uint8_t number_of_ports;
                uint8_t i1;
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &number_of_links))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_dpoe_queue_set) * number_of_links);
                for (i0 = 0; i0 < number_of_links; i0++)
                {
                    if (!bcmolt_epon_oam_dpoe_queue_set_scan(&postLenBuf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &number_of_ports))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_dpoe_queue_set) * number_of_ports);
                for (i1 = 0; i1 < number_of_ports; i1++)
                {
                    if (!bcmolt_epon_oam_dpoe_queue_set_scan(&postLenBuf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_FIRMWARE_FILENAME:
            {
                uint32_t firmware_filename_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    uint8_t dummy;
                    if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &dummy))
                    {
                        break;
                    }

                    if (dummy == 0)
                    {
                        break;
                    }

                    firmware_filename_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(firmware_filename_elem_count * sizeof(uint8_t));
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_PORT_STAT_THRESH:
            {
                if (!bcmolt_epon_oam_dpoe_statistic_threshold_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_LINK_STAT_THRESH:
            {
                if (!bcmolt_epon_oam_dpoe_statistic_threshold_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_KEY_EXPIRY_TIME:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_ENCRYPT_MODE:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_PORT_INGRESS_RULE:
            {
                if (!bcmolt_epon_oam_dpoe_rule_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_LUE_FIELD:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_ALT_CVLAN_ETHERTYPE:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_ALT_SVLAN_ETHERTYPE:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_BC_RATE_LIMIT:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_EGRESS_SHAPING:
            {
                uint8_t number_of_shapers;
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &number_of_shapers))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_dpoe_shaper) * number_of_shapers);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, number_of_shapers * 7))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_INGRESS_POLICING:
            {
                uint8_t number_of_rate_levels;
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &number_of_rate_levels))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_dpoe_rate_level) * number_of_rate_levels);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, number_of_rate_levels * 5))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_FEC_MODE:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_MFR_NAME:
            {
                uint32_t man_name_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                    {
                        break;
                    }

                    man_name_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(man_name_elem_count * sizeof(uint8_t));
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_FWARE_MFG_TIME_VAR_CTRL:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 13))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 13))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_VENDOR_NAME:
            {
                uint32_t vendor_name_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                    {
                        break;
                    }

                    vendor_name_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(vendor_name_elem_count * sizeof(uint8_t));
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_MODEL_NUMBER:
            {
                uint32_t model_number_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                    {
                        break;
                    }

                    model_number_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(model_number_elem_count * sizeof(uint8_t));
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_HW_VERSION:
            {
                uint32_t hw_version_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                    {
                        break;
                    }

                    hw_version_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(hw_version_elem_count * sizeof(uint8_t));
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_OPT_MON_TEMPERATURE:
            {
                uint32_t current_temperature_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                    {
                        break;
                    }

                    current_temperature_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(current_temperature_elem_count * sizeof(uint16_t));
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_OPT_MON_VCC:
            {
                uint32_t current_vcc_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                    {
                        break;
                    }

                    current_vcc_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(current_vcc_elem_count * sizeof(uint16_t));
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_OPT_MON_TX_BIAS:
            {
                uint32_t current_tx_bias_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                    {
                        break;
                    }

                    current_tx_bias_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(current_tx_bias_elem_count * sizeof(uint16_t));
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_OPT_MON_TX_POWER:
            {
                uint32_t current_tx_power_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                    {
                        break;
                    }

                    current_tx_power_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(current_tx_power_elem_count * sizeof(uint16_t));
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_OPT_MON_RX_POWER:
            {
                uint32_t current_rx_power_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                    {
                        break;
                    }

                    current_rx_power_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(current_rx_power_elem_count * sizeof(uint16_t));
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_UNICAST_FRAMES:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_UNICAST_FRAMES:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAME_TOO_SHORT:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAME64:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAME65127:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAME128255:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAME256511:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAME5121023:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAME10241518:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAME1519PLUS:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_FRAME64:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_FRAME65127:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_FRAME128255:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_FRAME256511:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_FRAME5121023:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_FRAME10241518:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_FRAME1519PLUS:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_QUEUE_DELAY_THRESH:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_QUEUE_DELAY:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_FRAMES_DROPPED:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_BYTES_DROPPED:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_BYTES_DELAYED:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_BYTES_UNUSED:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_DONU_PORT_TYPE:
            {
                uint32_t port_type_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                    {
                        break;
                    }

                    port_type_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(port_type_elem_count * sizeof(bcmolt_epon_oam_dpoe_port_type));
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_SUSPEND_RESUME_ALARM_REPORTING:
            {
                uint32_t default_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                    {
                        break;
                    }

                    default_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(default_elem_count * sizeof(bcmolt_epon_oam_dpoe_event_options));
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_IPMC_FORWARDING_RULE_CONFIGURATION:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_ITPID:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_BTPID:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_QUEUE_CIR:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_QUEUE_EIR:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_QUEUE_COLOR_MARKING:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_QUEUE_RATE_LIMITER_CAPABILITIES:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_COUPLING_FLAG:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_CLOCK_TRANSPORT_CAPABILITIES:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_ENABLE_CLOCK_TRANSPORT:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TIME_TRANSFER:
            {
                uint32_t tod_string_elem_count = 0;
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                    {
                        break;
                    }

                    tod_string_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(tod_string_elem_count * sizeof(uint8_t));
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_PROPAGATION_PARAMETERS:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RTT:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_DAC_CONFIGURATION:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_DAC_CONFIGURATION_ENABLE_DISABLE:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAME_BROADCAST:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_FRAMES_BROADCAST:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_FRAMES_MULTICAST:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAMES_MULTICAST:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_BYTES_GREEN:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_BYTES_GREEN:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_ONU_MCAST_LLID:
            {
                if (!bcmolt_epon_oam_u16_list_u8_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_UNI_MAC_LEARNED:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 6))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    /*Optional unpack fails do not cause errors */
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_UNI_MAC_TABLE_FULL_BEHAVIOR:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_ONU_PWR_SAVING_CAP:
            {
                uint8_t ven_spec_field_size;
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &ven_spec_field_size))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * ven_spec_field_size);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, ven_spec_field_size * 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_DAC_CONFIGURATION_FLAGS:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_DAC_PASSWORD_CHALLENGE:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_ENERGY_EFFICIENT_ETHERNET_STATUS:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_L2CP_FRAMES_DISCARDED:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_L2CP_FRAMES_RX:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_L2CP_FRAMES_TX:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_L2CP_OCTETS_DISCARDED:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_L2CP_OCTETS_RX:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_L2CP_OCTETS_TX:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_LINE_RATE_MODE:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_MEDIA_TYPE:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_NUMBER_OF_PROGRAMMABLE_COUNTERS:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_ONU_MAX_FRAME_SIZE_CAPABILITY:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_PWR_OVER_ETHERNET_STATUS:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_BYTES_YELLOW:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAMES_UNICAST:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_FRAMES_YELLOW:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_RX_L2ERRORS:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_BYTES_YELLOW:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_FRAMES_UNICAST:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_FRAMES_YELLOW:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_TX_L2ERRORS:
        case BCMOLT_EPON_OAM_DPOE_LEAF_ATTRIBUTE_UNI_MAX_FRAME_SIZE_LIMIT:
        default:
            {
                uint32_t unknown_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                    {
                        break;
                    }

                    unknown_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(unknown_elem_count * sizeof(uint8_t));
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dpoe_attribute_value_base_def_count_unknown(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dpoe_attribute_value_base_manufacturer_info_count_def(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dpoe_attribute_value_base_firmware_filename_count_firmware_filename(bcmolt_epon_oam_buf *buf)
{
    uint32_t count = 0;
    uint8_t dummy;
    bcmolt_epon_oam_buf bufClone = *buf;
    while (BCMOS_TRUE)
    {
        if (!bcmolt_epon_oam_buf_read_u8(&bufClone, &dummy))
        {
            break;
        }

        if (dummy == 0)
        {
            break;
        }

        count += 1;
    }

    return count;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dpoe_attribute_value_base_mfr_name_count_man_name(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dpoe_attribute_value_base_vendor_name_count_vendor_name(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dpoe_attribute_value_base_model_number_count_model_number(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dpoe_attribute_value_base_hw_version_count_hw_version(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dpoe_attribute_value_base_opt_mon_temperature_count_current_temperature(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 2);
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dpoe_attribute_value_base_opt_mon_vcc_count_current_vcc(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 2);
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dpoe_attribute_value_base_opt_mon_tx_bias_count_current_tx_bias(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 2);
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dpoe_attribute_value_base_opt_mon_tx_power_count_current_tx_power(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 2);
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dpoe_attribute_value_base_opt_mon_rx_power_count_current_rx_power(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 2);
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dpoe_attribute_value_base_donu_port_type_count_port_type(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dpoe_attribute_value_base_suspend_resume_alarm_reporting_count_def(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 2);
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dpoe_attribute_value_base_time_transfer_count_tod_string(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_attribute_value_mac_table_pack(bcmolt_epon_oam_dpoe_attribute_value_mac_table *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t i0;
    if ((this->mac_address_count > 0) && (this->mac_address == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"mac_address\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_mac_table\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->mac_address_count; i0++)
    {
        if (!bcmolt_epon_oam_buf_write_mac_address(buf, this->mac_address[i0]))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dpoe_attribute_value_mac_table_get_packed_length(bcmolt_epon_oam_dpoe_attribute_value_mac_table *this)
{
    return (6 * this->mac_address_count);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_attribute_value_mac_table_unpack(bcmolt_epon_oam_dpoe_attribute_value_mac_table *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint32_t i0;
    this->mac_address_count = bcmolt_epon_oam_dpoe_attribute_value_mac_table_count_mac_address(buf);
    if ((this->mac_address_count > 0) && (this->mac_address == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"mac_address\" of struct \"bcmolt_epon_oam_dpoe_attribute_value_mac_table\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->mac_address = (bcmos_mac_address *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->mac_address_count * sizeof(bcmos_mac_address));
        }
    }

    for (i0 = 0; i0 < this->mac_address_count; i0++)
    {
        if (!bcmolt_epon_oam_buf_read_mac_address(buf, &this->mac_address[i0]))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_attribute_value_mac_table_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    uint32_t mac_address_elem_count = 0;
    while (BCMOS_TRUE)
    {
        if (!bcmolt_epon_oam_buf_skip(packed, 6))
        {
            break;
        }

        mac_address_elem_count += 1;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(mac_address_elem_count * sizeof(bcmos_mac_address));
    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dpoe_attribute_value_mac_table_count_mac_address(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 6);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_event_base_pack(bcmolt_epon_oam_dpoe_event_base *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_dpoe_alarm_code_pack(this->event_code, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->event_code)
    {
        case BCMOLT_EPON_OAM_DPOE_ALARM_CODE_STATISTICS_ALARM:
            {
                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.statistics_alarm.raised))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_dpoe_object_type_pack(this->u.statistics_alarm.object_type, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.statistics_alarm.object_instance))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.statistics_alarm.stat_branch))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.statistics_alarm.stat_leaf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_ALARM_CODE_KEYEXCHANGE_FAILURE:
        case BCMOLT_EPON_OAM_DPOE_ALARM_CODE_LOS:
        case BCMOLT_EPON_OAM_DPOE_ALARM_CODE_MAC_TABLE_OVERFLOW:
        case BCMOLT_EPON_OAM_DPOE_ALARM_CODE_ONU_BUSY:
        case BCMOLT_EPON_OAM_DPOE_ALARM_CODE_PORT_DISABLED:
        case BCMOLT_EPON_OAM_DPOE_ALARM_CODE_POWER_FAILURE:
        default:
            {
                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.def.raised))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_dpoe_object_type_pack(this->u.def.object_type, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.def.object_instance))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dpoe_event_base_get_packed_length(bcmolt_epon_oam_dpoe_event_base *this)
{
    uint32_t count = 1;
    switch (this->event_code)
    {
        case BCMOLT_EPON_OAM_DPOE_ALARM_CODE_STATISTICS_ALARM:
            {
                count += 8;
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_ALARM_CODE_KEYEXCHANGE_FAILURE:
        case BCMOLT_EPON_OAM_DPOE_ALARM_CODE_LOS:
        case BCMOLT_EPON_OAM_DPOE_ALARM_CODE_MAC_TABLE_OVERFLOW:
        case BCMOLT_EPON_OAM_DPOE_ALARM_CODE_ONU_BUSY:
        case BCMOLT_EPON_OAM_DPOE_ALARM_CODE_PORT_DISABLED:
        case BCMOLT_EPON_OAM_DPOE_ALARM_CODE_POWER_FAILURE:
        default:
            {
                count += 5;
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_event_base_unpack(bcmolt_epon_oam_dpoe_event_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_dpoe_alarm_code_unpack(&this->event_code, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->event_code)
    {
        case BCMOLT_EPON_OAM_DPOE_ALARM_CODE_STATISTICS_ALARM:
            {
                if (!bcmolt_epon_oam_buf_read_bool(buf, &this->u.statistics_alarm.raised))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_dpoe_object_type_unpack(&this->u.statistics_alarm.object_type, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.statistics_alarm.object_instance))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.statistics_alarm.stat_branch))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.statistics_alarm.stat_leaf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_ALARM_CODE_KEYEXCHANGE_FAILURE:
        case BCMOLT_EPON_OAM_DPOE_ALARM_CODE_LOS:
        case BCMOLT_EPON_OAM_DPOE_ALARM_CODE_MAC_TABLE_OVERFLOW:
        case BCMOLT_EPON_OAM_DPOE_ALARM_CODE_ONU_BUSY:
        case BCMOLT_EPON_OAM_DPOE_ALARM_CODE_PORT_DISABLED:
        case BCMOLT_EPON_OAM_DPOE_ALARM_CODE_POWER_FAILURE:
        default:
            {
                if (!bcmolt_epon_oam_buf_read_bool(buf, &this->u.def.raised))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_dpoe_object_type_unpack(&this->u.def.object_type, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.def.object_instance))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_event_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_dpoe_alarm_code event_code;
    if (!bcmolt_epon_oam_dpoe_alarm_code_unpack(&event_code, packed))
    {
        return BCMOS_FALSE;
    }

    switch (event_code)
    {
        case BCMOLT_EPON_OAM_DPOE_ALARM_CODE_STATISTICS_ALARM:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_ALARM_CODE_KEYEXCHANGE_FAILURE:
        case BCMOLT_EPON_OAM_DPOE_ALARM_CODE_LOS:
        case BCMOLT_EPON_OAM_DPOE_ALARM_CODE_MAC_TABLE_OVERFLOW:
        case BCMOLT_EPON_OAM_DPOE_ALARM_CODE_ONU_BUSY:
        case BCMOLT_EPON_OAM_DPOE_ALARM_CODE_PORT_DISABLED:
        case BCMOLT_EPON_OAM_DPOE_ALARM_CODE_POWER_FAILURE:
        default:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_file_transfer_base_pack(bcmolt_epon_oam_dpoe_file_transfer_base *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_dpoe_file_transfer_opcode_pack(this->opcode, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->opcode)
    {
        case BCMOLT_EPON_OAM_DPOE_FILE_TRANSFER_OPCODE_FILE_READ:
            {
                if (!bcmolt_epon_oam_dpoe_file_type_pack(this->u.file_read.file_type, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_FILE_TRANSFER_OPCODE_FILE_WRITE:
            {
                if ((this->u.file_write.filename_count > 0) && (this->u.file_write.filename == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"filename\" of struct \"bcmolt_epon_oam_dpoe_file_transfer_base_file_write\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (this->u.file_write.filename_count > 128)
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.file_write.filename, this->u.file_write.filename_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_FILE_TRANSFER_OPCODE_FILE_DATA:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.file_data.block))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.file_data.length))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.file_data.length > 0) && (this->u.file_data.data == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"data\" of struct \"bcmolt_epon_oam_dpoe_file_transfer_base_file_data\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.file_data.data, this->u.file_data.length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_FILE_TRANSFER_OPCODE_FILE_ACK:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.file_ack.block))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_dpoe_file_transfer_error_pack(this->u.file_ack.error, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dpoe_file_transfer_base_get_packed_length(bcmolt_epon_oam_dpoe_file_transfer_base *this)
{
    uint32_t count = 1;
    switch (this->opcode)
    {
        case BCMOLT_EPON_OAM_DPOE_FILE_TRANSFER_OPCODE_FILE_READ:
            {
                count += 1;
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_FILE_TRANSFER_OPCODE_FILE_WRITE:
            {
                count += this->u.file_write.filename_count;
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_FILE_TRANSFER_OPCODE_FILE_DATA:
            {
                count += 4 + this->u.file_data.length;
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_FILE_TRANSFER_OPCODE_FILE_ACK:
            {
                count += 3;
            }
            break;
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_file_transfer_base_unpack(bcmolt_epon_oam_dpoe_file_transfer_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_dpoe_file_transfer_opcode_unpack(&this->opcode, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->opcode)
    {
        case BCMOLT_EPON_OAM_DPOE_FILE_TRANSFER_OPCODE_FILE_READ:
            {
                if (!bcmolt_epon_oam_dpoe_file_type_unpack(&this->u.file_read.file_type, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_FILE_TRANSFER_OPCODE_FILE_WRITE:
            {
                this->u.file_write.filename_count = bcmolt_epon_oam_dpoe_file_transfer_base_file_write_count_filename(buf);
                if ((this->u.file_write.filename_count > 0) && (this->u.file_write.filename == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"filename\" of struct \"bcmolt_epon_oam_dpoe_file_transfer_base_file_write\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.file_write.filename = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.file_write.filename_count * sizeof(uint8_t));
                    }
                }

                if (this->u.file_write.filename_count > 128)
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.file_write.filename, this->u.file_write.filename_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_FILE_TRANSFER_OPCODE_FILE_DATA:
            {
                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.file_data.block))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.file_data.length))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.file_data.length > 0) && (this->u.file_data.data == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"data\" of struct \"bcmolt_epon_oam_dpoe_file_transfer_base_file_data\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.file_data.data = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.file_data.length * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.file_data.data, this->u.file_data.length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_FILE_TRANSFER_OPCODE_FILE_ACK:
            {
                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.file_ack.block))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_dpoe_file_transfer_error_unpack(&this->u.file_ack.error, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_file_transfer_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_dpoe_file_transfer_opcode opcode;
    if (!bcmolt_epon_oam_dpoe_file_transfer_opcode_unpack(&opcode, packed))
    {
        return BCMOS_FALSE;
    }

    switch (opcode)
    {
        case BCMOLT_EPON_OAM_DPOE_FILE_TRANSFER_OPCODE_FILE_READ:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_FILE_TRANSFER_OPCODE_FILE_WRITE:
            {
                uint32_t filename_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(packed, 1))
                    {
                        break;
                    }

                    filename_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(filename_elem_count * sizeof(uint8_t));
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_FILE_TRANSFER_OPCODE_FILE_DATA:
            {
                uint16_t length;
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * length);
                if (!bcmolt_epon_oam_buf_skip(packed, length * 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_FILE_TRANSFER_OPCODE_FILE_ACK:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dpoe_file_transfer_base_file_write_count_filename(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_info_tlv_pack(bcmolt_epon_oam_dpoe_info_tlv *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_dpoe_info_tlv_type_pack(this->type, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->type)
    {
        case BCMOLT_EPON_OAM_DPOE_INFO_TLV_TYPE_DPOE_OAM_SUPPORT:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.dpoe_oam_support.dpoe_oam_version))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dpoe_info_tlv_get_packed_length(bcmolt_epon_oam_dpoe_info_tlv *this)
{
    uint32_t count = 1;
    switch (this->type)
    {
        case BCMOLT_EPON_OAM_DPOE_INFO_TLV_TYPE_DPOE_OAM_SUPPORT:
            {
                count += 1;
            }
            break;
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_info_tlv_unpack(bcmolt_epon_oam_dpoe_info_tlv *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_dpoe_info_tlv_type_unpack(&this->type, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->type)
    {
        case BCMOLT_EPON_OAM_DPOE_INFO_TLV_TYPE_DPOE_OAM_SUPPORT:
            {
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.dpoe_oam_support.dpoe_oam_version))
                {
                    /*Optional unpack fails do not cause errors */
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_info_tlv_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_dpoe_info_tlv_type type;
    if (!bcmolt_epon_oam_dpoe_info_tlv_type_unpack(&type, packed))
    {
        return BCMOS_FALSE;
    }

    switch (type)
    {
        case BCMOLT_EPON_OAM_DPOE_INFO_TLV_TYPE_DPOE_OAM_SUPPORT:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    /*Optional unpack fails do not cause errors */
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_u8value_pack(bcmolt_epon_oam_u8value *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u8(buf, this->value))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_u8value_unpack(bcmolt_epon_oam_u8value *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->value))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_u8value_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 1);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_u64value_pack(bcmolt_epon_oam_u64value *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u64(buf, this->value))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_u64value_unpack(bcmolt_epon_oam_u64value *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->value))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_u64value_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 8);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_std_attribute_value_pack(bcmolt_epon_oam_std_attribute_value *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t preLenFieldPos;
    uint32_t bytesAfterLenField;
    if (!bcmolt_epon_oam_var_leaf_attribute_pack(this->leaf, buf))
    {
        return BCMOS_FALSE;
    }

    if (this->width >= 0x0080)
    {
        bcmolt_epon_oam_buf_write_u8(buf, this->width);
        return BCMOS_TRUE;
    }

    preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

    /* skip over length field (we'll fill it in later) */
    if (!bcmolt_epon_oam_buf_skip(buf, 1))
    {
        return BCMOS_FALSE;
    }

    switch (this->leaf)
    {
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_ID:
            {
                if (!bcmolt_epon_oam_u8value_pack(&this->u.mac_id.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAMES_TX_OK:
            {
                if (!bcmolt_epon_oam_u64value_pack(&this->u.mac_frames_tx_ok.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_SINGLE_COLL_FRAMES:
            {
                if (!bcmolt_epon_oam_u64value_pack(&this->u.mac_single_coll_frames.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_MULTIPLE_COLL_FRAMES:
            {
                if (!bcmolt_epon_oam_u64value_pack(&this->u.mac_multiple_coll_frames.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAMES_RX_OK:
            {
                if (!bcmolt_epon_oam_u64value_pack(&this->u.mac_frames_rx_ok.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FCS_ERR:
            {
                if (!bcmolt_epon_oam_u64value_pack(&this->u.mac_fcs_err.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_ALIGN_ERR:
            {
                if (!bcmolt_epon_oam_u64value_pack(&this->u.mac_align_err.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_OCTETS_TX_OK:
            {
                if (!bcmolt_epon_oam_u64value_pack(&this->u.mac_octets_tx_ok.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAMES_DEFERRED:
            {
                if (!bcmolt_epon_oam_u8value_pack(&this->u.mac_frames_deferred.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_LATE_COLLISIONS:
            {
                if (!bcmolt_epon_oam_u64value_pack(&this->u.mac_late_collisions.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_EXCESSIVE_COLLISIONS:
            {
                if (!bcmolt_epon_oam_u64value_pack(&this->u.mac_excessive_collisions.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAMES_LOST_MAC_TX_ERR:
            {
                if (!bcmolt_epon_oam_u64value_pack(&this->u.mac_frames_lost_mac_tx_err.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CARRIER_SENSE_ERR:
            {
                if (!bcmolt_epon_oam_u8value_pack(&this->u.mac_carrier_sense_err.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_OCTETS_RX_OK:
            {
                if (!bcmolt_epon_oam_u64value_pack(&this->u.mac_octets_rx_ok.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAMES_LOST_MAC_RX_ERR:
            {
                if (!bcmolt_epon_oam_u64value_pack(&this->u.mac_frames_lost_mac_rx_err.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_MCAST_FRAMES_TX_OK:
            {
                if (!bcmolt_epon_oam_u64value_pack(&this->u.mac_mcast_frames_tx_ok.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_BCAST_FRAMES_TX_OK:
            {
                if (!bcmolt_epon_oam_u64value_pack(&this->u.mac_bcast_frames_tx_ok.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FR_EXCESSIVE_DEFERRAL:
            {
                if (!bcmolt_epon_oam_u8value_pack(&this->u.mac_fr_excessive_deferral.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_MCAST_FRAMES_RX_OK:
            {
                if (!bcmolt_epon_oam_u64value_pack(&this->u.mac_mcast_frames_rx_ok.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_BCAST_FRAMES_RX_OK:
            {
                if (!bcmolt_epon_oam_u64value_pack(&this->u.mac_bcast_frames_rx_ok.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_IN_RANGE_LEN_ERR:
            {
                if (!bcmolt_epon_oam_u64value_pack(&this->u.mac_in_range_len_err.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_OUT_OF_RANGE_LEN_ERR:
            {
                if (!bcmolt_epon_oam_u64value_pack(&this->u.mac_out_of_range_len_err.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAME_TOO_LONG:
            {
                if (!bcmolt_epon_oam_u64value_pack(&this->u.mac_frame_too_long.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_ENABLE_STATUS:
            {
                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.mac_enable_status.status))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_ADDR:
            {
                if (!bcmolt_epon_oam_buf_write_mac_address(buf, this->u.mac_addr.mac_address))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_TYPE:
            {
                if (!bcmolt_epon_oam_std_phy_type_pack(this->u.phy_type.type, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_SYMBOL_ERR_DURING_CARRIER:
            {
                if (!bcmolt_epon_oam_u64value_pack(&this->u.phy_symbol_err_during_carrier.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_ADMIN_STATE:
            {
                if (!bcmolt_epon_oam_oam_state_pack(this->u.phy_admin_state.state, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_MEDIA_AVAIL:
            {
                if (!bcmolt_epon_oam_mau_media_available_pack(this->u.mau_media_avail.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_ID:
            {
                if (!bcmolt_epon_oam_u8value_pack(&this->u.auto_neg_id.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_ADMIN_STATE:
            {
                if (!bcmolt_epon_oam_autonegotiate_admin_state_pack(this->u.auto_neg_admin_state.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_REMOTE_SIG:
            {
                if (!bcmolt_epon_oam_auto_remote_sig_pack(this->u.auto_neg_remote_sig.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_AUTO_CFG:
            {
                if (!bcmolt_epon_oam_auto_negotiation_auto_config_pack(this->u.auto_neg_auto_cfg.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_LOCAL_TECH_ABILITY:
            {
                uint32_t i0;
                if ((this->u.auto_neg_local_tech_ability.capabilities_count > 0) && (this->u.auto_neg_local_tech_ability.capabilities == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"capabilities\" of struct \"bcmolt_epon_oam_std_attribute_value_auto_neg_local_tech_ability\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i0 = 0; i0 < this->u.auto_neg_local_tech_ability.capabilities_count; i0++)
                {
                    if (!bcmolt_epon_oam_std_auto_negoitation_capability_pack(this->u.auto_neg_local_tech_ability.capabilities[i0], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_ADVERTISED_TECH_ABILITY:
            {
                uint32_t i1;
                if ((this->u.auto_neg_advertised_tech_ability.capabilities_count > 0) && (this->u.auto_neg_advertised_tech_ability.capabilities == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"capabilities\" of struct \"bcmolt_epon_oam_std_attribute_value_auto_neg_advertised_tech_ability\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i1 = 0; i1 < this->u.auto_neg_advertised_tech_ability.capabilities_count; i1++)
                {
                    if (!bcmolt_epon_oam_std_auto_negoitation_capability_pack(this->u.auto_neg_advertised_tech_ability.capabilities[i1], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_RX_TECH:
            {
                uint32_t i2;
                if ((this->u.auto_neg_rx_tech.capabilities_count > 0) && (this->u.auto_neg_rx_tech.capabilities == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"capabilities\" of struct \"bcmolt_epon_oam_std_attribute_value_auto_neg_rx_tech\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i2 = 0; i2 < this->u.auto_neg_rx_tech.capabilities_count; i2++)
                {
                    if (!bcmolt_epon_oam_std_auto_negoitation_capability_pack(this->u.auto_neg_rx_tech.capabilities[i2], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_LOCAL_SELECT_ABLE:
            {
                if (!bcmolt_epon_oam_auto_selector_pack(this->u.auto_neg_local_select_able.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_AD_SELECT_ABLE:
            {
                if (!bcmolt_epon_oam_auto_selector_pack(this->u.auto_neg_ad_select_able.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_RX_SELECT_ABLE:
            {
                if (!bcmolt_epon_oam_auto_selector_pack(this->u.auto_neg_rx_select_able.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_DUPLEX_STATUS:
            {
                if (!bcmolt_epon_oam_mac_duplex_status_pack(this->u.mac_duplex_status.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_FUNCS_SUPPORTED:
            {
                uint32_t i3;
                if ((this->u.mac_ctrl_funcs_supported.functions_count > 0) && (this->u.mac_ctrl_funcs_supported.functions == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"functions\" of struct \"bcmolt_epon_oam_std_attribute_value_mac_ctrl_funcs_supported\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i3 = 0; i3 < this->u.mac_ctrl_funcs_supported.functions_count; i3++)
                {
                    if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.mac_ctrl_funcs_supported.functions[i3]))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_FRAMES_TX:
            {
                if (!bcmolt_epon_oam_u64value_pack(&this->u.mac_ctrl_frames_tx.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_FRAMES_RX:
            {
                if (!bcmolt_epon_oam_u64value_pack(&this->u.mac_ctrl_frames_rx.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_UNSUPPORTED_OP_RX:
            {
                if (!bcmolt_epon_oam_u64value_pack(&this->u.mac_ctrl_unsupported_op_rx.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_PAUSE_DELAY:
            {
                if (!bcmolt_epon_oam_u64value_pack(&this->u.mac_ctrl_pause_delay.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_PAUSE_TX:
            {
                if (!bcmolt_epon_oam_u64value_pack(&this->u.mac_ctrl_pause_tx.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_PAUSE_RX:
            {
                if (!bcmolt_epon_oam_u64value_pack(&this->u.mac_ctrl_pause_rx.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_SECS_EVENT:
            {
                if (!bcmolt_epon_oam_u64value_pack(&this->u.oam_local_err_frame_secs_event.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_PERIOD_EVENT:
            {
                if (!bcmolt_epon_oam_u64value_pack(&this->u.oam_local_err_frame_period_event.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FR_SEC_SUM_EVENT:
            {
                if (!bcmolt_epon_oam_u64value_pack(&this->u.oam_local_err_fr_sec_sum_event.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_EMUL_CRC8ERR:
            {
                if (!bcmolt_epon_oam_u64value_pack(&this->u.oam_emul_crc8err.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_MAC_CTRL_FRAMES_TX:
            {
                if (!bcmolt_epon_oam_u64value_pack(&this->u.mpcp_mac_ctrl_frames_tx.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_MAC_CTRL_FRAMES_RX:
            {
                if (!bcmolt_epon_oam_u64value_pack(&this->u.mpcp_mac_ctrl_frames_rx.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_DISCOVERY_WINDOW_TX:
            {
                if (!bcmolt_epon_oam_u64value_pack(&this->u.mpcp_discovery_window_tx.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_DISCOVERY_TIMEOUT:
            {
                if (!bcmolt_epon_oam_u64value_pack(&this->u.mpcp_discovery_timeout.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_FEC_CORRECTED_BLOCKS:
            {
                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.fec_corrected_blocks.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_FEC_UNCORRECTABLE_BLOCKS:
            {
                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.fec_uncorrectable_blocks.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_FEC_ABILITY:
            {
                if (!bcmolt_epon_oam_fec_support_pack(this->u.fec_ability.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_FEC_MODE:
            {
                if (!bcmolt_epon_oam_std_fec_mode_pack(this->u.fec_mode.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_TX_GATE:
            {
                if (!bcmolt_epon_oam_u64value_pack(&this->u.mpcp_tx_gate.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_TX_REG_ACK:
            {
                if (!bcmolt_epon_oam_u64value_pack(&this->u.mpcp_tx_reg_ack.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_TX_REGISTER:
            {
                if (!bcmolt_epon_oam_u64value_pack(&this->u.mpcp_tx_register.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_TX_REG_REQUEST:
            {
                if (!bcmolt_epon_oam_u64value_pack(&this->u.mpcp_tx_reg_request.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_TX_REPORT:
            {
                if (!bcmolt_epon_oam_u64value_pack(&this->u.mpcp_tx_report.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_RX_GATE:
            {
                if (!bcmolt_epon_oam_u64value_pack(&this->u.mpcp_rx_gate.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_RX_REG_ACK:
            {
                if (!bcmolt_epon_oam_u64value_pack(&this->u.mpcp_rx_reg_ack.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_RX_REGISTER:
            {
                if (!bcmolt_epon_oam_u64value_pack(&this->u.mpcp_rx_register.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_RX_REG_REQUEST:
            {
                if (!bcmolt_epon_oam_u64value_pack(&this->u.mpcp_rx_reg_request.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_RX_REPORT:
            {
                if (!bcmolt_epon_oam_u64value_pack(&this->u.mpcp_rx_report.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_COLLISION_FRAMES:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.mac_collision_frames.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ACTOR_ADMIN_KEY:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ACTOR_OPER_KEY:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ACTOR_SYS_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ACTOR_SYS_PRI:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ADMIN_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_AGG_OR_INDIVIDUAL:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_BCAST_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_BCAST_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_COLLECTOR_MAX_DELAY:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_DATA_RATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_DESC:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_FRAMES_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_FRAMES_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_LINK_UP_DOWN_NOTIFY_EN:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_MAC_ADDR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_MCAST_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_MCAST_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_NAME:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_OPER_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_PARTNER_OPER_KEY:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_PARTNER_SYS_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_PARTNER_SYS_PRI:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_PORT_LIST:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_RX_DISCARD:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_RX_ERR_FRAMES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_RX_OCTETS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_TIME_OF_LAST_OPER_CHANGE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_TX_DISCARD:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_TX_ERR_FRAMES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_TX_OCTETS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_UNK_PROTOCOL:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_GROUP_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_GROUP_PORT_CAPACITY:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_GROUP_PORT_MAP:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CAPABILITIES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_MCAST_ADDR_LIST:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_MCAST_RX_STATUS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_PROMISCUOUS_STATUS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_TX_ENABLE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_ADMIN_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_BAND_SPLIT_FREQ:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_BAND_SPLIT_TYPE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_FALSE_CARRIERS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_IDLE_ERROR_COUNT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_JABBER:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_LOSE_MEDIA_CTR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_TYPE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_TYPE_LIST:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_ADMIN_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_DUP_EVENT_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_EMUL_BAD_LLID_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_EMUL_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_EMUL_SPD_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_EVENT_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_FRAMES_LOST_OAM_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_INFO_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_INFO_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FR_SEC_SUM_THRESH:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FR_SEC_SUM_WIN:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_PERIOD_THRESH:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_PERIOD_WIN:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_SECS_THRESH:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_SECS_WIN:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_SYM_PERIOD_EVENT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_SYM_PERIOD_THRESH:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_SYM_PERIOD_WIN:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_FLAGS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOOP_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOOP_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_MODE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_ORG_SPECIFIC_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_ORG_SPECIFIC_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_PDU_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_PDU_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_CONFIG:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_PERIOD_EVENT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_PERIOD_THRESH:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_PERIOD_WIN:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_SECS_EVENT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_SECS_THRESH:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_SECS_WIN:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_FLAGS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_MAC_ADDR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_PDU_CONFIG:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_VENDOR_DEVICE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_VENDOR_OUI:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_VENDOR_VERSION:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_UNIQUE_EVENT_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_UNSUPPORTED_OPCODES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_VAR_REQ_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_VAR_REQ_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_VAR_RESP_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_VAR_RESP_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_MII_DETECT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_SQE_TEST_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_TYPE_LIST:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_ADMIN_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_ALIGN_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_AUTO_PART_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_AUTO_PARTITIONS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_BURSTS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_COLLISIONS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_DATA_RATE_MISMATCHES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_FCS_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_FRAMES_TOO_LONG:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_ISOLATES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_LAST_SOURCE_ADDR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_LATE_EVENTS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_READABLE_FRAMES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_READABLE_OCTETS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_RUNTS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_SHORT_EVENTS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_SOURCE_ADDR_CHANGES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_SYM_ERR_DURING_PKT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_VERY_LONG_EVENTS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_GROUP_CAPACITY:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_GROUP_MAP:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_HEALTH_DATA:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_HEALTH_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_HEALTH_TEXT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_TX_COLLISIONS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_TYPE:
        default:
            {
            }
            break;
    }

    bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
    if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_std_attribute_value_get_packed_length(bcmolt_epon_oam_std_attribute_value *this)
{
    if (this->width >= 0x0080)
    {
        return this->width;
    }
    else
    {
        uint32_t count = 3;
        switch (this->leaf)
        {
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_ID:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAMES_TX_OK:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_SINGLE_COLL_FRAMES:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_MULTIPLE_COLL_FRAMES:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAMES_RX_OK:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FCS_ERR:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_ALIGN_ERR:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_OCTETS_TX_OK:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAMES_DEFERRED:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_LATE_COLLISIONS:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_EXCESSIVE_COLLISIONS:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAMES_LOST_MAC_TX_ERR:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CARRIER_SENSE_ERR:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_OCTETS_RX_OK:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAMES_LOST_MAC_RX_ERR:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_MCAST_FRAMES_TX_OK:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_BCAST_FRAMES_TX_OK:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FR_EXCESSIVE_DEFERRAL:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_MCAST_FRAMES_RX_OK:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_BCAST_FRAMES_RX_OK:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_IN_RANGE_LEN_ERR:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_OUT_OF_RANGE_LEN_ERR:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAME_TOO_LONG:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_ENABLE_STATUS:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_ADDR:
                {
                    count += 6;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_TYPE:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_SYMBOL_ERR_DURING_CARRIER:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_ADMIN_STATE:
                {
                    count += 4;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_MEDIA_AVAIL:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_ID:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_ADMIN_STATE:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_REMOTE_SIG:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_AUTO_CFG:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_LOCAL_TECH_ABILITY:
                {
                    count += (2 * this->u.auto_neg_local_tech_ability.capabilities_count);
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_ADVERTISED_TECH_ABILITY:
                {
                    count += (2 * this->u.auto_neg_advertised_tech_ability.capabilities_count);
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_RX_TECH:
                {
                    count += (2 * this->u.auto_neg_rx_tech.capabilities_count);
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_LOCAL_SELECT_ABLE:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_AD_SELECT_ABLE:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_RX_SELECT_ABLE:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_DUPLEX_STATUS:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_FUNCS_SUPPORTED:
                {
                    count += (2 * this->u.mac_ctrl_funcs_supported.functions_count);
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_FRAMES_TX:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_FRAMES_RX:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_UNSUPPORTED_OP_RX:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_PAUSE_DELAY:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_PAUSE_TX:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_PAUSE_RX:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_SECS_EVENT:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_PERIOD_EVENT:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FR_SEC_SUM_EVENT:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_EMUL_CRC8ERR:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_MAC_CTRL_FRAMES_TX:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_MAC_CTRL_FRAMES_RX:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_DISCOVERY_WINDOW_TX:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_DISCOVERY_TIMEOUT:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_FEC_CORRECTED_BLOCKS:
                {
                    count += 4;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_FEC_UNCORRECTABLE_BLOCKS:
                {
                    count += 4;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_FEC_ABILITY:
                {
                    count += 4;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_FEC_MODE:
                {
                    count += 4;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_TX_GATE:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_TX_REG_ACK:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_TX_REGISTER:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_TX_REG_REQUEST:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_TX_REPORT:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_RX_GATE:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_RX_REG_ACK:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_RX_REGISTER:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_RX_REG_REQUEST:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_RX_REPORT:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_COLLISION_FRAMES:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ACTOR_ADMIN_KEY:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ACTOR_OPER_KEY:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ACTOR_SYS_ID:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ACTOR_SYS_PRI:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ADMIN_STATE:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_AGG_OR_INDIVIDUAL:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_BCAST_RX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_BCAST_TX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_COLLECTOR_MAX_DELAY:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_DATA_RATE:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_DESC:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_FRAMES_RX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_FRAMES_TX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ID:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_LINK_UP_DOWN_NOTIFY_EN:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_MAC_ADDR:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_MCAST_RX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_MCAST_TX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_NAME:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_OPER_STATE:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_PARTNER_OPER_KEY:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_PARTNER_SYS_ID:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_PARTNER_SYS_PRI:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_PORT_LIST:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_RX_DISCARD:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_RX_ERR_FRAMES:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_RX_OCTETS:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_TIME_OF_LAST_OPER_CHANGE:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_TX_DISCARD:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_TX_ERR_FRAMES:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_TX_OCTETS:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_UNK_PROTOCOL:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_GROUP_ID:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_GROUP_PORT_CAPACITY:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_GROUP_PORT_MAP:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CAPABILITIES:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_ID:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_MCAST_ADDR_LIST:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_MCAST_RX_STATUS:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_PROMISCUOUS_STATUS:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_TX_ENABLE:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_ADMIN_STATE:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_BAND_SPLIT_FREQ:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_BAND_SPLIT_TYPE:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_FALSE_CARRIERS:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_ID:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_IDLE_ERROR_COUNT:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_JABBER:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_LOSE_MEDIA_CTR:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_TYPE:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_TYPE_LIST:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_ADMIN_STATE:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_DUP_EVENT_RX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_EMUL_BAD_LLID_ERR:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_EMUL_ID:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_EMUL_SPD_ERR:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_EVENT_TX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_FRAMES_LOST_OAM_ERR:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_ID:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_INFO_RX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_INFO_TX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FR_SEC_SUM_THRESH:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FR_SEC_SUM_WIN:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_PERIOD_THRESH:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_PERIOD_WIN:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_SECS_THRESH:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_SECS_WIN:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_SYM_PERIOD_EVENT:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_SYM_PERIOD_THRESH:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_SYM_PERIOD_WIN:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_FLAGS:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOOP_RX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOOP_TX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_MODE:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_ORG_SPECIFIC_RX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_ORG_SPECIFIC_TX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_PDU_RX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_PDU_TX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_CONFIG:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_PERIOD_EVENT:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_PERIOD_THRESH:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_PERIOD_WIN:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_SECS_EVENT:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_SECS_THRESH:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_SECS_WIN:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_FLAGS:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_MAC_ADDR:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_PDU_CONFIG:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_STATE:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_VENDOR_DEVICE:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_VENDOR_OUI:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_VENDOR_VERSION:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_UNIQUE_EVENT_RX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_UNSUPPORTED_OPCODES:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_VAR_REQ_RX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_VAR_REQ_TX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_VAR_RESP_RX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_VAR_RESP_TX:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_ID:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_MII_DETECT:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_SQE_TEST_ERR:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_TYPE_LIST:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_ADMIN_STATE:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_ALIGN_ERR:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_AUTO_PART_STATE:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_AUTO_PARTITIONS:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_BURSTS:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_COLLISIONS:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_DATA_RATE_MISMATCHES:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_FCS_ERR:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_FRAMES_TOO_LONG:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_ID:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_ISOLATES:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_LAST_SOURCE_ADDR:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_LATE_EVENTS:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_READABLE_FRAMES:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_READABLE_OCTETS:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_RUNTS:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_SHORT_EVENTS:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_SOURCE_ADDR_CHANGES:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_SYM_ERR_DURING_PKT:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_VERY_LONG_EVENTS:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_GROUP_CAPACITY:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_GROUP_MAP:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_HEALTH_DATA:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_HEALTH_STATE:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_HEALTH_TEXT:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_ID:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_TX_COLLISIONS:
            case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_TYPE:
            default:
                {
                }
                break;
        }

        return count;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_std_attribute_value_unpack(bcmolt_epon_oam_std_attribute_value *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    bcmolt_epon_oam_buf postLenBuf;
    if (!bcmolt_epon_oam_var_leaf_attribute_unpack(&this->leaf, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->width))
    {
        return BCMOS_FALSE;
    }

    if (this->width >= 0x0080)
    {
        return BCMOS_TRUE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, (this->width == 0) ? 0x0080 : this->width, buf->curr);
    switch (this->leaf)
    {
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_ID:
            {
                if (!bcmolt_epon_oam_u8value_unpack(&this->u.mac_id.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAMES_TX_OK:
            {
                if (!bcmolt_epon_oam_u64value_unpack(&this->u.mac_frames_tx_ok.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_SINGLE_COLL_FRAMES:
            {
                if (!bcmolt_epon_oam_u64value_unpack(&this->u.mac_single_coll_frames.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_MULTIPLE_COLL_FRAMES:
            {
                if (!bcmolt_epon_oam_u64value_unpack(&this->u.mac_multiple_coll_frames.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAMES_RX_OK:
            {
                if (!bcmolt_epon_oam_u64value_unpack(&this->u.mac_frames_rx_ok.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FCS_ERR:
            {
                if (!bcmolt_epon_oam_u64value_unpack(&this->u.mac_fcs_err.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_ALIGN_ERR:
            {
                if (!bcmolt_epon_oam_u64value_unpack(&this->u.mac_align_err.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_OCTETS_TX_OK:
            {
                if (!bcmolt_epon_oam_u64value_unpack(&this->u.mac_octets_tx_ok.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAMES_DEFERRED:
            {
                if (!bcmolt_epon_oam_u8value_unpack(&this->u.mac_frames_deferred.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_LATE_COLLISIONS:
            {
                if (!bcmolt_epon_oam_u64value_unpack(&this->u.mac_late_collisions.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_EXCESSIVE_COLLISIONS:
            {
                if (!bcmolt_epon_oam_u64value_unpack(&this->u.mac_excessive_collisions.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAMES_LOST_MAC_TX_ERR:
            {
                if (!bcmolt_epon_oam_u64value_unpack(&this->u.mac_frames_lost_mac_tx_err.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CARRIER_SENSE_ERR:
            {
                if (!bcmolt_epon_oam_u8value_unpack(&this->u.mac_carrier_sense_err.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_OCTETS_RX_OK:
            {
                if (!bcmolt_epon_oam_u64value_unpack(&this->u.mac_octets_rx_ok.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAMES_LOST_MAC_RX_ERR:
            {
                if (!bcmolt_epon_oam_u64value_unpack(&this->u.mac_frames_lost_mac_rx_err.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_MCAST_FRAMES_TX_OK:
            {
                if (!bcmolt_epon_oam_u64value_unpack(&this->u.mac_mcast_frames_tx_ok.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_BCAST_FRAMES_TX_OK:
            {
                if (!bcmolt_epon_oam_u64value_unpack(&this->u.mac_bcast_frames_tx_ok.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FR_EXCESSIVE_DEFERRAL:
            {
                if (!bcmolt_epon_oam_u8value_unpack(&this->u.mac_fr_excessive_deferral.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_MCAST_FRAMES_RX_OK:
            {
                if (!bcmolt_epon_oam_u64value_unpack(&this->u.mac_mcast_frames_rx_ok.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_BCAST_FRAMES_RX_OK:
            {
                if (!bcmolt_epon_oam_u64value_unpack(&this->u.mac_bcast_frames_rx_ok.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_IN_RANGE_LEN_ERR:
            {
                if (!bcmolt_epon_oam_u64value_unpack(&this->u.mac_in_range_len_err.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_OUT_OF_RANGE_LEN_ERR:
            {
                if (!bcmolt_epon_oam_u64value_unpack(&this->u.mac_out_of_range_len_err.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAME_TOO_LONG:
            {
                if (!bcmolt_epon_oam_u64value_unpack(&this->u.mac_frame_too_long.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_ENABLE_STATUS:
            {
                if (!bcmolt_epon_oam_buf_read_bool(&postLenBuf, &this->u.mac_enable_status.status))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_ADDR:
            {
                if (!bcmolt_epon_oam_buf_read_mac_address(&postLenBuf, &this->u.mac_addr.mac_address))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_TYPE:
            {
                if (!bcmolt_epon_oam_std_phy_type_unpack(&this->u.phy_type.type, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_SYMBOL_ERR_DURING_CARRIER:
            {
                if (!bcmolt_epon_oam_u64value_unpack(&this->u.phy_symbol_err_during_carrier.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_ADMIN_STATE:
            {
                if (!bcmolt_epon_oam_oam_state_unpack(&this->u.phy_admin_state.state, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_MEDIA_AVAIL:
            {
                if (!bcmolt_epon_oam_mau_media_available_unpack(&this->u.mau_media_avail.value, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_ID:
            {
                if (!bcmolt_epon_oam_u8value_unpack(&this->u.auto_neg_id.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_ADMIN_STATE:
            {
                if (!bcmolt_epon_oam_autonegotiate_admin_state_unpack(&this->u.auto_neg_admin_state.value, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_REMOTE_SIG:
            {
                if (!bcmolt_epon_oam_auto_remote_sig_unpack(&this->u.auto_neg_remote_sig.value, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_AUTO_CFG:
            {
                if (!bcmolt_epon_oam_auto_negotiation_auto_config_unpack(&this->u.auto_neg_auto_cfg.value, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_LOCAL_TECH_ABILITY:
            {
                uint32_t i0;
                this->u.auto_neg_local_tech_ability.capabilities_count = bcmolt_epon_oam_std_attribute_value_auto_neg_local_tech_ability_count_capabilities(&postLenBuf);
                if ((this->u.auto_neg_local_tech_ability.capabilities_count > 0) && (this->u.auto_neg_local_tech_ability.capabilities == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"capabilities\" of struct \"bcmolt_epon_oam_std_attribute_value_auto_neg_local_tech_ability\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.auto_neg_local_tech_ability.capabilities = (bcmolt_epon_oam_std_auto_negoitation_capability *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.auto_neg_local_tech_ability.capabilities_count * sizeof(bcmolt_epon_oam_std_auto_negoitation_capability));
                    }
                }

                for (i0 = 0; i0 < this->u.auto_neg_local_tech_ability.capabilities_count; i0++)
                {
                    if (!bcmolt_epon_oam_std_auto_negoitation_capability_unpack(&this->u.auto_neg_local_tech_ability.capabilities[i0], &postLenBuf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_ADVERTISED_TECH_ABILITY:
            {
                uint32_t i1;
                this->u.auto_neg_advertised_tech_ability.capabilities_count = bcmolt_epon_oam_std_attribute_value_auto_neg_advertised_tech_ability_count_capabilities(&postLenBuf);
                if ((this->u.auto_neg_advertised_tech_ability.capabilities_count > 0) && (this->u.auto_neg_advertised_tech_ability.capabilities == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"capabilities\" of struct \"bcmolt_epon_oam_std_attribute_value_auto_neg_advertised_tech_ability\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.auto_neg_advertised_tech_ability.capabilities = (bcmolt_epon_oam_std_auto_negoitation_capability *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.auto_neg_advertised_tech_ability.capabilities_count * sizeof(bcmolt_epon_oam_std_auto_negoitation_capability));
                    }
                }

                for (i1 = 0; i1 < this->u.auto_neg_advertised_tech_ability.capabilities_count; i1++)
                {
                    if (!bcmolt_epon_oam_std_auto_negoitation_capability_unpack(&this->u.auto_neg_advertised_tech_ability.capabilities[i1], &postLenBuf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_RX_TECH:
            {
                uint32_t i2;
                this->u.auto_neg_rx_tech.capabilities_count = bcmolt_epon_oam_std_attribute_value_auto_neg_rx_tech_count_capabilities(&postLenBuf);
                if ((this->u.auto_neg_rx_tech.capabilities_count > 0) && (this->u.auto_neg_rx_tech.capabilities == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"capabilities\" of struct \"bcmolt_epon_oam_std_attribute_value_auto_neg_rx_tech\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.auto_neg_rx_tech.capabilities = (bcmolt_epon_oam_std_auto_negoitation_capability *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.auto_neg_rx_tech.capabilities_count * sizeof(bcmolt_epon_oam_std_auto_negoitation_capability));
                    }
                }

                for (i2 = 0; i2 < this->u.auto_neg_rx_tech.capabilities_count; i2++)
                {
                    if (!bcmolt_epon_oam_std_auto_negoitation_capability_unpack(&this->u.auto_neg_rx_tech.capabilities[i2], &postLenBuf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_LOCAL_SELECT_ABLE:
            {
                if (!bcmolt_epon_oam_auto_selector_unpack(&this->u.auto_neg_local_select_able.value, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_AD_SELECT_ABLE:
            {
                if (!bcmolt_epon_oam_auto_selector_unpack(&this->u.auto_neg_ad_select_able.value, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_RX_SELECT_ABLE:
            {
                if (!bcmolt_epon_oam_auto_selector_unpack(&this->u.auto_neg_rx_select_able.value, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_DUPLEX_STATUS:
            {
                if (!bcmolt_epon_oam_mac_duplex_status_unpack(&this->u.mac_duplex_status.value, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_FUNCS_SUPPORTED:
            {
                uint32_t i3;
                this->u.mac_ctrl_funcs_supported.functions_count = bcmolt_epon_oam_std_attribute_value_mac_ctrl_funcs_supported_count_functions(&postLenBuf);
                if ((this->u.mac_ctrl_funcs_supported.functions_count > 0) && (this->u.mac_ctrl_funcs_supported.functions == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"functions\" of struct \"bcmolt_epon_oam_std_attribute_value_mac_ctrl_funcs_supported\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.mac_ctrl_funcs_supported.functions = (uint16_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.mac_ctrl_funcs_supported.functions_count * sizeof(uint16_t));
                    }
                }

                for (i3 = 0; i3 < this->u.mac_ctrl_funcs_supported.functions_count; i3++)
                {
                    if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.mac_ctrl_funcs_supported.functions[i3]))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_FRAMES_TX:
            {
                if (!bcmolt_epon_oam_u64value_unpack(&this->u.mac_ctrl_frames_tx.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_FRAMES_RX:
            {
                if (!bcmolt_epon_oam_u64value_unpack(&this->u.mac_ctrl_frames_rx.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_UNSUPPORTED_OP_RX:
            {
                if (!bcmolt_epon_oam_u64value_unpack(&this->u.mac_ctrl_unsupported_op_rx.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_PAUSE_DELAY:
            {
                if (!bcmolt_epon_oam_u64value_unpack(&this->u.mac_ctrl_pause_delay.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_PAUSE_TX:
            {
                if (!bcmolt_epon_oam_u64value_unpack(&this->u.mac_ctrl_pause_tx.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_PAUSE_RX:
            {
                if (!bcmolt_epon_oam_u64value_unpack(&this->u.mac_ctrl_pause_rx.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_SECS_EVENT:
            {
                if (!bcmolt_epon_oam_u64value_unpack(&this->u.oam_local_err_frame_secs_event.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_PERIOD_EVENT:
            {
                if (!bcmolt_epon_oam_u64value_unpack(&this->u.oam_local_err_frame_period_event.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FR_SEC_SUM_EVENT:
            {
                if (!bcmolt_epon_oam_u64value_unpack(&this->u.oam_local_err_fr_sec_sum_event.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_EMUL_CRC8ERR:
            {
                if (!bcmolt_epon_oam_u64value_unpack(&this->u.oam_emul_crc8err.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_MAC_CTRL_FRAMES_TX:
            {
                if (!bcmolt_epon_oam_u64value_unpack(&this->u.mpcp_mac_ctrl_frames_tx.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_MAC_CTRL_FRAMES_RX:
            {
                if (!bcmolt_epon_oam_u64value_unpack(&this->u.mpcp_mac_ctrl_frames_rx.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_DISCOVERY_WINDOW_TX:
            {
                if (!bcmolt_epon_oam_u64value_unpack(&this->u.mpcp_discovery_window_tx.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_DISCOVERY_TIMEOUT:
            {
                if (!bcmolt_epon_oam_u64value_unpack(&this->u.mpcp_discovery_timeout.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_FEC_CORRECTED_BLOCKS:
            {
                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.fec_corrected_blocks.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_FEC_UNCORRECTABLE_BLOCKS:
            {
                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.fec_uncorrectable_blocks.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_FEC_ABILITY:
            {
                if (!bcmolt_epon_oam_fec_support_unpack(&this->u.fec_ability.value, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_FEC_MODE:
            {
                if (!bcmolt_epon_oam_std_fec_mode_unpack(&this->u.fec_mode.value, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_TX_GATE:
            {
                if (!bcmolt_epon_oam_u64value_unpack(&this->u.mpcp_tx_gate.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_TX_REG_ACK:
            {
                if (!bcmolt_epon_oam_u64value_unpack(&this->u.mpcp_tx_reg_ack.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_TX_REGISTER:
            {
                if (!bcmolt_epon_oam_u64value_unpack(&this->u.mpcp_tx_register.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_TX_REG_REQUEST:
            {
                if (!bcmolt_epon_oam_u64value_unpack(&this->u.mpcp_tx_reg_request.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_TX_REPORT:
            {
                if (!bcmolt_epon_oam_u64value_unpack(&this->u.mpcp_tx_report.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_RX_GATE:
            {
                if (!bcmolt_epon_oam_u64value_unpack(&this->u.mpcp_rx_gate.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_RX_REG_ACK:
            {
                if (!bcmolt_epon_oam_u64value_unpack(&this->u.mpcp_rx_reg_ack.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_RX_REGISTER:
            {
                if (!bcmolt_epon_oam_u64value_unpack(&this->u.mpcp_rx_register.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_RX_REG_REQUEST:
            {
                if (!bcmolt_epon_oam_u64value_unpack(&this->u.mpcp_rx_reg_request.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_RX_REPORT:
            {
                if (!bcmolt_epon_oam_u64value_unpack(&this->u.mpcp_rx_report.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_COLLISION_FRAMES:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.mac_collision_frames.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ACTOR_ADMIN_KEY:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ACTOR_OPER_KEY:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ACTOR_SYS_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ACTOR_SYS_PRI:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ADMIN_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_AGG_OR_INDIVIDUAL:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_BCAST_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_BCAST_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_COLLECTOR_MAX_DELAY:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_DATA_RATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_DESC:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_FRAMES_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_FRAMES_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_LINK_UP_DOWN_NOTIFY_EN:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_MAC_ADDR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_MCAST_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_MCAST_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_NAME:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_OPER_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_PARTNER_OPER_KEY:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_PARTNER_SYS_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_PARTNER_SYS_PRI:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_PORT_LIST:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_RX_DISCARD:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_RX_ERR_FRAMES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_RX_OCTETS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_TIME_OF_LAST_OPER_CHANGE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_TX_DISCARD:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_TX_ERR_FRAMES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_TX_OCTETS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_UNK_PROTOCOL:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_GROUP_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_GROUP_PORT_CAPACITY:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_GROUP_PORT_MAP:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CAPABILITIES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_MCAST_ADDR_LIST:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_MCAST_RX_STATUS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_PROMISCUOUS_STATUS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_TX_ENABLE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_ADMIN_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_BAND_SPLIT_FREQ:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_BAND_SPLIT_TYPE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_FALSE_CARRIERS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_IDLE_ERROR_COUNT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_JABBER:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_LOSE_MEDIA_CTR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_TYPE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_TYPE_LIST:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_ADMIN_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_DUP_EVENT_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_EMUL_BAD_LLID_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_EMUL_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_EMUL_SPD_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_EVENT_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_FRAMES_LOST_OAM_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_INFO_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_INFO_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FR_SEC_SUM_THRESH:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FR_SEC_SUM_WIN:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_PERIOD_THRESH:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_PERIOD_WIN:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_SECS_THRESH:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_SECS_WIN:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_SYM_PERIOD_EVENT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_SYM_PERIOD_THRESH:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_SYM_PERIOD_WIN:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_FLAGS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOOP_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOOP_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_MODE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_ORG_SPECIFIC_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_ORG_SPECIFIC_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_PDU_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_PDU_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_CONFIG:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_PERIOD_EVENT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_PERIOD_THRESH:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_PERIOD_WIN:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_SECS_EVENT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_SECS_THRESH:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_SECS_WIN:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_FLAGS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_MAC_ADDR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_PDU_CONFIG:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_VENDOR_DEVICE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_VENDOR_OUI:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_VENDOR_VERSION:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_UNIQUE_EVENT_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_UNSUPPORTED_OPCODES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_VAR_REQ_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_VAR_REQ_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_VAR_RESP_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_VAR_RESP_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_MII_DETECT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_SQE_TEST_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_TYPE_LIST:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_ADMIN_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_ALIGN_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_AUTO_PART_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_AUTO_PARTITIONS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_BURSTS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_COLLISIONS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_DATA_RATE_MISMATCHES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_FCS_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_FRAMES_TOO_LONG:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_ISOLATES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_LAST_SOURCE_ADDR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_LATE_EVENTS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_READABLE_FRAMES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_READABLE_OCTETS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_RUNTS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_SHORT_EVENTS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_SOURCE_ADDR_CHANGES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_SYM_ERR_DURING_PKT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_VERY_LONG_EVENTS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_GROUP_CAPACITY:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_GROUP_MAP:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_HEALTH_DATA:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_HEALTH_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_HEALTH_TEXT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_TX_COLLISIONS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_TYPE:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(buf, (this->width == 0) ? 0x0080 : this->width))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_std_attribute_value_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_var_leaf_attribute leaf;
    bcmolt_epon_oam_buf postLenBuf;
    uint8_t length;
    if (!bcmolt_epon_oam_var_leaf_attribute_unpack(&leaf, packed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
    {
        return BCMOS_FALSE;
    }

    if (length >= 0x0080)
    {
        return BCMOS_TRUE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
    switch (leaf)
    {
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_ID:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAMES_TX_OK:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_SINGLE_COLL_FRAMES:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_MULTIPLE_COLL_FRAMES:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAMES_RX_OK:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FCS_ERR:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_ALIGN_ERR:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_OCTETS_TX_OK:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAMES_DEFERRED:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_LATE_COLLISIONS:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_EXCESSIVE_COLLISIONS:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAMES_LOST_MAC_TX_ERR:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CARRIER_SENSE_ERR:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_OCTETS_RX_OK:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAMES_LOST_MAC_RX_ERR:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_MCAST_FRAMES_TX_OK:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_BCAST_FRAMES_TX_OK:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FR_EXCESSIVE_DEFERRAL:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_MCAST_FRAMES_RX_OK:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_BCAST_FRAMES_RX_OK:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_IN_RANGE_LEN_ERR:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_OUT_OF_RANGE_LEN_ERR:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_FRAME_TOO_LONG:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_ENABLE_STATUS:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_ADDR:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 6))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_TYPE:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_SYMBOL_ERR_DURING_CARRIER:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_ADMIN_STATE:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_MEDIA_AVAIL:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_ID:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_ADMIN_STATE:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_REMOTE_SIG:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_AUTO_CFG:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_LOCAL_TECH_ABILITY:
            {
                uint32_t capabilities_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                    {
                        break;
                    }

                    capabilities_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(capabilities_elem_count * sizeof(bcmolt_epon_oam_std_auto_negoitation_capability));
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_ADVERTISED_TECH_ABILITY:
            {
                uint32_t capabilities_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                    {
                        break;
                    }

                    capabilities_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(capabilities_elem_count * sizeof(bcmolt_epon_oam_std_auto_negoitation_capability));
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_RX_TECH:
            {
                uint32_t capabilities_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                    {
                        break;
                    }

                    capabilities_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(capabilities_elem_count * sizeof(bcmolt_epon_oam_std_auto_negoitation_capability));
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_LOCAL_SELECT_ABLE:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_AD_SELECT_ABLE:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AUTO_NEG_RX_SELECT_ABLE:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_DUPLEX_STATUS:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_FUNCS_SUPPORTED:
            {
                uint32_t functions_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                    {
                        break;
                    }

                    functions_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(functions_elem_count * sizeof(uint16_t));
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_FRAMES_TX:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_FRAMES_RX:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_UNSUPPORTED_OP_RX:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_PAUSE_DELAY:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_PAUSE_TX:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_PAUSE_RX:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_SECS_EVENT:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_PERIOD_EVENT:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FR_SEC_SUM_EVENT:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_EMUL_CRC8ERR:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_MAC_CTRL_FRAMES_TX:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_MAC_CTRL_FRAMES_RX:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_DISCOVERY_WINDOW_TX:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_DISCOVERY_TIMEOUT:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_FEC_CORRECTED_BLOCKS:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_FEC_UNCORRECTABLE_BLOCKS:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_FEC_ABILITY:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_FEC_MODE:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_TX_GATE:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_TX_REG_ACK:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_TX_REGISTER:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_TX_REG_REQUEST:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_TX_REPORT:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_RX_GATE:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_RX_REG_ACK:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_RX_REGISTER:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_RX_REG_REQUEST:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MPCP_RX_REPORT:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_COLLISION_FRAMES:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ACTOR_ADMIN_KEY:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ACTOR_OPER_KEY:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ACTOR_SYS_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ACTOR_SYS_PRI:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ADMIN_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_AGG_OR_INDIVIDUAL:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_BCAST_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_BCAST_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_COLLECTOR_MAX_DELAY:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_DATA_RATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_DESC:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_FRAMES_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_FRAMES_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_LINK_UP_DOWN_NOTIFY_EN:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_MAC_ADDR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_MCAST_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_MCAST_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_NAME:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_OPER_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_PARTNER_OPER_KEY:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_PARTNER_SYS_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_PARTNER_SYS_PRI:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_PORT_LIST:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_RX_DISCARD:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_RX_ERR_FRAMES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_RX_OCTETS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_TIME_OF_LAST_OPER_CHANGE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_TX_DISCARD:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_TX_ERR_FRAMES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_TX_OCTETS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_AGG_UNK_PROTOCOL:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_GROUP_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_GROUP_PORT_CAPACITY:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_GROUP_PORT_MAP:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CAPABILITIES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_CTRL_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_MCAST_ADDR_LIST:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_MCAST_RX_STATUS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_PROMISCUOUS_STATUS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAC_TX_ENABLE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_ADMIN_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_BAND_SPLIT_FREQ:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_BAND_SPLIT_TYPE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_FALSE_CARRIERS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_IDLE_ERROR_COUNT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_JABBER:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_LOSE_MEDIA_CTR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_TYPE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_MAU_TYPE_LIST:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_ADMIN_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_DUP_EVENT_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_EMUL_BAD_LLID_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_EMUL_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_EMUL_SPD_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_EVENT_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_FRAMES_LOST_OAM_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_INFO_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_INFO_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FR_SEC_SUM_THRESH:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FR_SEC_SUM_WIN:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_PERIOD_THRESH:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_PERIOD_WIN:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_SECS_THRESH:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_FRAME_SECS_WIN:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_SYM_PERIOD_EVENT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_SYM_PERIOD_THRESH:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_ERR_SYM_PERIOD_WIN:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOCAL_FLAGS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOOP_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_LOOP_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_MODE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_ORG_SPECIFIC_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_ORG_SPECIFIC_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_PDU_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_PDU_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_CONFIG:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_PERIOD_EVENT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_PERIOD_THRESH:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_PERIOD_WIN:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_SECS_EVENT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_SECS_THRESH:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_ERR_FRAME_SECS_WIN:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_FLAGS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_MAC_ADDR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_PDU_CONFIG:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_VENDOR_DEVICE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_VENDOR_OUI:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_REMOTE_VENDOR_VERSION:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_UNIQUE_EVENT_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_UNSUPPORTED_OPCODES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_VAR_REQ_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_VAR_REQ_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_VAR_RESP_RX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_OAM_VAR_RESP_TX:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_MII_DETECT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_SQE_TEST_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PHY_TYPE_LIST:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_ADMIN_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_ALIGN_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_AUTO_PART_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_AUTO_PARTITIONS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_BURSTS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_COLLISIONS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_DATA_RATE_MISMATCHES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_FCS_ERR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_FRAMES_TOO_LONG:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_ISOLATES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_LAST_SOURCE_ADDR:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_LATE_EVENTS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_READABLE_FRAMES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_READABLE_OCTETS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_RUNTS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_SHORT_EVENTS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_SOURCE_ADDR_CHANGES:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_SYM_ERR_DURING_PKT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_PORT_VERY_LONG_EVENTS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_GROUP_CAPACITY:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_GROUP_MAP:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_HEALTH_DATA:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_HEALTH_STATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_HEALTH_TEXT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_ID:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_TX_COLLISIONS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ATTRIBUTE_RPT_TYPE:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_std_attribute_value_auto_neg_local_tech_ability_count_capabilities(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 2);
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_std_attribute_value_auto_neg_advertised_tech_ability_count_capabilities(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 2);
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_std_attribute_value_auto_neg_rx_tech_count_capabilities(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 2);
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_std_attribute_value_mac_ctrl_funcs_supported_count_functions(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 2);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_std_action_value_base_pack(bcmolt_epon_oam_std_action_value_base *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t preLenFieldPos;
    uint32_t bytesAfterLenField;
    if (!bcmolt_epon_oam_var_leaf_action_pack(this->leaf, buf))
    {
        return BCMOS_FALSE;
    }

    if (this->width >= 0x0080)
    {
        bcmolt_epon_oam_buf_write_u8(buf, this->width);
        return BCMOS_TRUE;
    }

    preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

    /* skip over length field (we'll fill it in later) */
    if (!bcmolt_epon_oam_buf_skip(buf, 1))
    {
        return BCMOS_FALSE;
    }

    switch (this->leaf)
    {
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_AUTO_ADMIN_CONTROL:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_AUTO_RENEGOTIATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_MAC_ADD_GROUP_ADDRESS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_MAC_DEL_GROUP_ADDRESS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_MAC_INIT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_MAC_SELF_TEST:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_MAU_ADMIN_CONTROL:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_MAU_RESET:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_PHY_ADMIN_CONTROL:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_PORT_ADMIN_CONTROL:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_RPT_IN_SERVICE_TEST:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_RPT_RESET:
        default:
            {
            }
            break;
    }

    bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
    if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_std_action_value_base_unpack(bcmolt_epon_oam_std_action_value_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    bcmolt_epon_oam_buf postLenBuf;
    if (!bcmolt_epon_oam_var_leaf_action_unpack(&this->leaf, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->width))
    {
        return BCMOS_FALSE;
    }

    if (this->width >= 0x0080)
    {
        return BCMOS_TRUE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, (this->width == 0) ? 0x0080 : this->width, buf->curr);
    switch (this->leaf)
    {
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_AUTO_ADMIN_CONTROL:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_AUTO_RENEGOTIATE:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_MAC_ADD_GROUP_ADDRESS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_MAC_DEL_GROUP_ADDRESS:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_MAC_INIT:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_MAC_SELF_TEST:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_MAU_ADMIN_CONTROL:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_MAU_RESET:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_PHY_ADMIN_CONTROL:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_PORT_ADMIN_CONTROL:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_RPT_IN_SERVICE_TEST:
        case BCMOLT_EPON_OAM_VAR_LEAF_ACTION_RPT_RESET:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(buf, (this->width == 0) ? 0x0080 : this->width))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_std_action_value_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 3);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_var_container_base_pack(bcmolt_epon_oam_dpoe_var_container_base *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_dpoe_branch_pack(this->branch, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->branch)
    {
        case BCMOLT_EPON_OAM_DPOE_BRANCH_OBJECT:
            {
                if (!bcmolt_epon_oam_dpoe_object_context_base_pack(&this->u.object.object_context, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_STANDARD_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_std_attribute_value_pack(&this->u.standard_attribute.attribute, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_STANDARD_ACTION:
            {
                if (!bcmolt_epon_oam_std_action_value_base_pack(&this->u.standard_action.action, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_EXTENDED_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_dpoe_attribute_value_base_pack(&this->u.extended_attribute.attribute, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_EXTENDED_ACTION:
            {
                if (!bcmolt_epon_oam_dpoe_action_value_base_pack(&this->u.extended_action.action, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_END:
            {
                if ((this->u.end.unknown_count > 0) && (this->u.end.unknown == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"unknown\" of struct \"bcmolt_epon_oam_dpoe_var_container_base_end\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.end.unknown, this->u.end.unknown_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_PROGRAMMABLE_COUNTER:
        default:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.def.leaf))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.def.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.def.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dpoe_var_container_base_get_packed_length(bcmolt_epon_oam_dpoe_var_container_base *this)
{
    uint32_t count = 1;
    switch (this->branch)
    {
        case BCMOLT_EPON_OAM_DPOE_BRANCH_OBJECT:
            {
                count += bcmolt_epon_oam_dpoe_object_context_base_get_packed_length(&this->u.object.object_context);
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_STANDARD_ATTRIBUTE:
            {
                count += bcmolt_epon_oam_std_attribute_value_get_packed_length(&this->u.standard_attribute.attribute);
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_STANDARD_ACTION:
            {
                count += 3;
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_EXTENDED_ATTRIBUTE:
            {
                count += bcmolt_epon_oam_dpoe_attribute_value_base_get_packed_length(&this->u.extended_attribute.attribute);
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_EXTENDED_ACTION:
            {
                count += bcmolt_epon_oam_dpoe_action_value_base_get_packed_length(&this->u.extended_action.action);
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_END:
            {
                count += this->u.end.unknown_count;
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_PROGRAMMABLE_COUNTER:
        default:
            {
                count += 3;
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_var_container_base_unpack(bcmolt_epon_oam_dpoe_var_container_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_dpoe_branch_unpack(&this->branch, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->branch)
    {
        case BCMOLT_EPON_OAM_DPOE_BRANCH_OBJECT:
            {
                if (!bcmolt_epon_oam_dpoe_object_context_base_unpack(&this->u.object.object_context, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_STANDARD_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_std_attribute_value_unpack(&this->u.standard_attribute.attribute, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_STANDARD_ACTION:
            {
                if (!bcmolt_epon_oam_std_action_value_base_unpack(&this->u.standard_action.action, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_EXTENDED_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_dpoe_attribute_value_base_unpack(&this->u.extended_attribute.attribute, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_EXTENDED_ACTION:
            {
                if (!bcmolt_epon_oam_dpoe_action_value_base_unpack(&this->u.extended_action.action, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_END:
            {
                this->u.end.unknown_count = bcmolt_epon_oam_dpoe_var_container_base_end_count_unknown(buf);
                if ((this->u.end.unknown_count > 0) && (this->u.end.unknown == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"unknown\" of struct \"bcmolt_epon_oam_dpoe_var_container_base_end\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.end.unknown = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.end.unknown_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.end.unknown, this->u.end.unknown_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_PROGRAMMABLE_COUNTER:
        default:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.def.leaf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.def.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.def.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.def.width == 0) ? 0x0080 : this->u.def.width, buf->curr);
                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.def.width == 0) ? 0x0080 : this->u.def.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_var_container_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_dpoe_branch branch;
    if (!bcmolt_epon_oam_dpoe_branch_unpack(&branch, packed))
    {
        return BCMOS_FALSE;
    }

    switch (branch)
    {
        case BCMOLT_EPON_OAM_DPOE_BRANCH_OBJECT:
            {
                if (!bcmolt_epon_oam_dpoe_object_context_base_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_STANDARD_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_std_attribute_value_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_STANDARD_ACTION:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 3))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_EXTENDED_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_dpoe_attribute_value_base_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_EXTENDED_ACTION:
            {
                if (!bcmolt_epon_oam_dpoe_action_value_base_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_END:
            {
                uint32_t unknown_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(packed, 1))
                    {
                        break;
                    }

                    unknown_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(unknown_elem_count * sizeof(uint8_t));
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_PROGRAMMABLE_COUNTER:
        default:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dpoe_var_container_base_end_count_unknown(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_vendor_extended_base_pack(bcmolt_epon_oam_dpoe_vendor_extended_base *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_dpoe_opcode_pack(this->op, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->op)
    {
        case BCMOLT_EPON_OAM_DPOE_OPCODE_GET_REQUEST:
            {
                uint32_t i0;
                if ((this->u.get_request.vars_count > 0) && (this->u.get_request.vars == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vars\" of struct \"bcmolt_epon_oam_dpoe_vendor_extended_base_get_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i0 = 0; i0 < this->u.get_request.vars_count; i0++)
                {
                    if (!bcmolt_epon_oam_dpoe_var_descriptor_pack(&this->u.get_request.vars[i0], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_GET_RESPONSE:
            {
                uint32_t i1;
                if ((this->u.get_response.vars_count > 0) && (this->u.get_response.vars == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vars\" of struct \"bcmolt_epon_oam_dpoe_vendor_extended_base_get_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i1 = 0; i1 < this->u.get_response.vars_count; i1++)
                {
                    if (!bcmolt_epon_oam_dpoe_var_container_base_pack(&this->u.get_response.vars[i1], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_SET_REQUEST:
            {
                uint32_t i2;
                if ((this->u.set_request.vars_count > 0) && (this->u.set_request.vars == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vars\" of struct \"bcmolt_epon_oam_dpoe_vendor_extended_base_set_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i2 = 0; i2 < this->u.set_request.vars_count; i2++)
                {
                    if (!bcmolt_epon_oam_dpoe_var_container_base_pack(&this->u.set_request.vars[i2], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_SET_RESPONSE:
            {
                uint32_t i3;
                if ((this->u.set_response.vars_count > 0) && (this->u.set_response.vars == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vars\" of struct \"bcmolt_epon_oam_dpoe_vendor_extended_base_set_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i3 = 0; i3 < this->u.set_response.vars_count; i3++)
                {
                    if (!bcmolt_epon_oam_dpoe_var_container_base_pack(&this->u.set_response.vars[i3], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_MCAST_REG:
            {
                if (!bcmolt_epon_oam_dpoe_mcast_reg_code_pack(this->u.mcast_reg.action_code, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.mcast_reg.multicast_llid))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_MCAST_REG_RESP:
            {
                if (!bcmolt_epon_oam_dpoe_mcast_ctrl_resp_code_pack(this->u.mcast_reg_resp.status, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.mcast_reg_resp.multicast_llid))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_KEY_EXCHANGE:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.key_exchange.key_number))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.key_exchange.key_length))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.key_exchange.key_length > 0) && (this->u.key_exchange.key_data == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"key_data\" of struct \"bcmolt_epon_oam_dpoe_vendor_extended_base_key_exchange\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.key_exchange.key_data, this->u.key_exchange.key_length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_FILE_TRANSFER:
            {
                if (!bcmolt_epon_oam_dpoe_file_transfer_base_pack(&this->u.file_transfer.file_transfer, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_DYNAMIC_IPMCAST_CTRL:
            {
                if (!bcmolt_epon_oam_dpoe_mcast_ctrl_action_pack(this->u.dynamic_ipmcast_ctrl.action, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.dynamic_ipmcast_ctrl.llid))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.dynamic_ipmcast_ctrl.ipsa, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.dynamic_ipmcast_ctrl.ipda, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_mac_address(buf, this->u.dynamic_ipmcast_ctrl.client_mac))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_DYNAMIC_IPMCAST_CTRL_RESP:
            {
                if (!bcmolt_epon_oam_dpoe_mcast_ctrl_resp_code_pack(this->u.dynamic_ipmcast_ctrl_resp.result_code, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_STATIC_IPMCAST_CTRL:
            {
                if (!bcmolt_epon_oam_dpoe_mcast_ctrl_action_pack(this->u.static_ipmcast_ctrl.action, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.static_ipmcast_ctrl.llid))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.static_ipmcast_ctrl.ipsa, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.static_ipmcast_ctrl.ipda, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.static_ipmcast_ctrl.port))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_STATIC_IPMCAST_CTRL_RESP:
            {
                if (!bcmolt_epon_oam_dpoe_mcast_ctrl_resp_code_pack(this->u.static_ipmcast_ctrl_resp.result_code, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_RESERVED:
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dpoe_vendor_extended_base_get_packed_length(bcmolt_epon_oam_dpoe_vendor_extended_base *this)
{
    uint32_t count = 1;
    switch (this->op)
    {
        case BCMOLT_EPON_OAM_DPOE_OPCODE_GET_REQUEST:
            {
                uint32_t i0;
                if ((this->u.get_request.vars_count > 0) && (this->u.get_request.vars == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vars_count\" of struct \"bcmolt_epon_oam_dpoe_vendor_extended_base\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return 0;
                }

                for (i0 = 0; i0 < this->u.get_request.vars_count; i0++)
                {
                    count += bcmolt_epon_oam_dpoe_var_descriptor_get_packed_length(&this->u.get_request.vars[i0]);
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_GET_RESPONSE:
            {
                uint32_t i1;
                if ((this->u.get_response.vars_count > 0) && (this->u.get_response.vars == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vars_count\" of struct \"bcmolt_epon_oam_dpoe_vendor_extended_base\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return 0;
                }

                for (i1 = 0; i1 < this->u.get_response.vars_count; i1++)
                {
                    count += bcmolt_epon_oam_dpoe_var_container_base_get_packed_length(&this->u.get_response.vars[i1]);
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_SET_REQUEST:
            {
                uint32_t i2;
                if ((this->u.set_request.vars_count > 0) && (this->u.set_request.vars == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vars_count\" of struct \"bcmolt_epon_oam_dpoe_vendor_extended_base\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return 0;
                }

                for (i2 = 0; i2 < this->u.set_request.vars_count; i2++)
                {
                    count += bcmolt_epon_oam_dpoe_var_container_base_get_packed_length(&this->u.set_request.vars[i2]);
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_SET_RESPONSE:
            {
                uint32_t i3;
                if ((this->u.set_response.vars_count > 0) && (this->u.set_response.vars == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vars_count\" of struct \"bcmolt_epon_oam_dpoe_vendor_extended_base\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return 0;
                }

                for (i3 = 0; i3 < this->u.set_response.vars_count; i3++)
                {
                    count += bcmolt_epon_oam_dpoe_var_container_base_get_packed_length(&this->u.set_response.vars[i3]);
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_MCAST_REG:
            {
                count += 3;
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_MCAST_REG_RESP:
            {
                count += 3;
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_KEY_EXCHANGE:
            {
                count += 2 + this->u.key_exchange.key_length;
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_FILE_TRANSFER:
            {
                count += bcmolt_epon_oam_dpoe_file_transfer_base_get_packed_length(&this->u.file_transfer.file_transfer);
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_DYNAMIC_IPMCAST_CTRL:
            {
                count += 41;
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_DYNAMIC_IPMCAST_CTRL_RESP:
            {
                count += 1;
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_STATIC_IPMCAST_CTRL:
            {
                count += 36;
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_STATIC_IPMCAST_CTRL_RESP:
            {
                count += 1;
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_RESERVED:
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_vendor_extended_base_unpack(bcmolt_epon_oam_dpoe_vendor_extended_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_dpoe_opcode_unpack(&this->op, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->op)
    {
        case BCMOLT_EPON_OAM_DPOE_OPCODE_GET_REQUEST:
            {
                uint32_t i0;
                this->u.get_request.vars_count = bcmolt_epon_oam_dpoe_vendor_extended_base_get_request_count_vars(buf);
                if ((this->u.get_request.vars_count > 0) && (this->u.get_request.vars == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vars\" of struct \"bcmolt_epon_oam_dpoe_vendor_extended_base_get_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.get_request.vars = (bcmolt_epon_oam_dpoe_var_descriptor *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.get_request.vars_count * sizeof(bcmolt_epon_oam_dpoe_var_descriptor));
                    }
                }

                for (i0 = 0; i0 < this->u.get_request.vars_count; i0++)
                {
                    if (!bcmolt_epon_oam_dpoe_var_descriptor_unpack(&this->u.get_request.vars[i0], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_GET_RESPONSE:
            {
                uint32_t i1;
                this->u.get_response.vars_count = bcmolt_epon_oam_dpoe_vendor_extended_base_get_response_count_vars(buf);
                if ((this->u.get_response.vars_count > 0) && (this->u.get_response.vars == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vars\" of struct \"bcmolt_epon_oam_dpoe_vendor_extended_base_get_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.get_response.vars = (bcmolt_epon_oam_dpoe_var_container_base *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.get_response.vars_count * sizeof(bcmolt_epon_oam_dpoe_var_container_base));
                    }
                }

                for (i1 = 0; i1 < this->u.get_response.vars_count; i1++)
                {
                    if (!bcmolt_epon_oam_dpoe_var_container_base_unpack(&this->u.get_response.vars[i1], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_SET_REQUEST:
            {
                uint32_t i2;
                this->u.set_request.vars_count = bcmolt_epon_oam_dpoe_vendor_extended_base_set_request_count_vars(buf);
                if ((this->u.set_request.vars_count > 0) && (this->u.set_request.vars == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vars\" of struct \"bcmolt_epon_oam_dpoe_vendor_extended_base_set_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.set_request.vars = (bcmolt_epon_oam_dpoe_var_container_base *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.set_request.vars_count * sizeof(bcmolt_epon_oam_dpoe_var_container_base));
                    }
                }

                for (i2 = 0; i2 < this->u.set_request.vars_count; i2++)
                {
                    if (!bcmolt_epon_oam_dpoe_var_container_base_unpack(&this->u.set_request.vars[i2], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_SET_RESPONSE:
            {
                uint32_t i3;
                this->u.set_response.vars_count = bcmolt_epon_oam_dpoe_vendor_extended_base_set_response_count_vars(buf);
                if ((this->u.set_response.vars_count > 0) && (this->u.set_response.vars == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vars\" of struct \"bcmolt_epon_oam_dpoe_vendor_extended_base_set_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.set_response.vars = (bcmolt_epon_oam_dpoe_var_container_base *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.set_response.vars_count * sizeof(bcmolt_epon_oam_dpoe_var_container_base));
                    }
                }

                for (i3 = 0; i3 < this->u.set_response.vars_count; i3++)
                {
                    if (!bcmolt_epon_oam_dpoe_var_container_base_unpack(&this->u.set_response.vars[i3], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_MCAST_REG:
            {
                if (!bcmolt_epon_oam_dpoe_mcast_reg_code_unpack(&this->u.mcast_reg.action_code, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.mcast_reg.multicast_llid))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_MCAST_REG_RESP:
            {
                if (!bcmolt_epon_oam_dpoe_mcast_ctrl_resp_code_unpack(&this->u.mcast_reg_resp.status, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.mcast_reg_resp.multicast_llid))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_KEY_EXCHANGE:
            {
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.key_exchange.key_number))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.key_exchange.key_length))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.key_exchange.key_length > 0) && (this->u.key_exchange.key_data == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"key_data\" of struct \"bcmolt_epon_oam_dpoe_vendor_extended_base_key_exchange\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.key_exchange.key_data = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.key_exchange.key_length * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.key_exchange.key_data, this->u.key_exchange.key_length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_FILE_TRANSFER:
            {
                if (!bcmolt_epon_oam_dpoe_file_transfer_base_unpack(&this->u.file_transfer.file_transfer, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_DYNAMIC_IPMCAST_CTRL:
            {
                if (!bcmolt_epon_oam_dpoe_mcast_ctrl_action_unpack(&this->u.dynamic_ipmcast_ctrl.action, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.dynamic_ipmcast_ctrl.llid))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.dynamic_ipmcast_ctrl.ipsa, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.dynamic_ipmcast_ctrl.ipda, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_mac_address(buf, &this->u.dynamic_ipmcast_ctrl.client_mac))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_DYNAMIC_IPMCAST_CTRL_RESP:
            {
                if (!bcmolt_epon_oam_dpoe_mcast_ctrl_resp_code_unpack(&this->u.dynamic_ipmcast_ctrl_resp.result_code, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_STATIC_IPMCAST_CTRL:
            {
                if (!bcmolt_epon_oam_dpoe_mcast_ctrl_action_unpack(&this->u.static_ipmcast_ctrl.action, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.static_ipmcast_ctrl.llid))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.static_ipmcast_ctrl.ipsa, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.static_ipmcast_ctrl.ipda, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.static_ipmcast_ctrl.port))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_STATIC_IPMCAST_CTRL_RESP:
            {
                if (!bcmolt_epon_oam_dpoe_mcast_ctrl_resp_code_unpack(&this->u.static_ipmcast_ctrl_resp.result_code, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_RESERVED:
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_dpoe_vendor_extended_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_dpoe_opcode op;
    if (!bcmolt_epon_oam_dpoe_opcode_unpack(&op, packed))
    {
        return BCMOS_FALSE;
    }

    switch (op)
    {
        case BCMOLT_EPON_OAM_DPOE_OPCODE_GET_REQUEST:
            {
                uint32_t vars_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_dpoe_var_descriptor_scan(packed, extra_mem))
                    {
                        break;
                    }

                    vars_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(vars_elem_count * sizeof(bcmolt_epon_oam_dpoe_var_descriptor));
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_GET_RESPONSE:
            {
                uint32_t vars_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_dpoe_var_container_base_scan(packed, extra_mem))
                    {
                        break;
                    }

                    vars_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(vars_elem_count * sizeof(bcmolt_epon_oam_dpoe_var_container_base));
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_SET_REQUEST:
            {
                uint32_t vars_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_dpoe_var_container_base_scan(packed, extra_mem))
                    {
                        break;
                    }

                    vars_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(vars_elem_count * sizeof(bcmolt_epon_oam_dpoe_var_container_base));
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_SET_RESPONSE:
            {
                uint32_t vars_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_dpoe_var_container_base_scan(packed, extra_mem))
                    {
                        break;
                    }

                    vars_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(vars_elem_count * sizeof(bcmolt_epon_oam_dpoe_var_container_base));
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_MCAST_REG:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_MCAST_REG_RESP:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_KEY_EXCHANGE:
            {
                uint8_t key_length;
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(packed, &key_length))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * key_length);
                if (!bcmolt_epon_oam_buf_skip(packed, key_length * 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_FILE_TRANSFER:
            {
                if (!bcmolt_epon_oam_dpoe_file_transfer_base_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_DYNAMIC_IPMCAST_CTRL:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 6))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_DYNAMIC_IPMCAST_CTRL_RESP:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_STATIC_IPMCAST_CTRL:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_STATIC_IPMCAST_CTRL_RESP:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_RESERVED:
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dpoe_vendor_extended_base_get_request_count_vars(bcmolt_epon_oam_buf *buf)
{
    uint32_t count = 0;
    uint32_t dummy = 0;
    bcmolt_epon_oam_buf bufClone = *buf;
    while (BCMOS_TRUE)
    {
        if (!bcmolt_epon_oam_dpoe_var_descriptor_scan(&bufClone, &dummy))
        {
            break;
        }

        count += 1;
    }

    return count;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dpoe_vendor_extended_base_get_response_count_vars(bcmolt_epon_oam_buf *buf)
{
    uint32_t count = 0;
    uint32_t dummy = 0;
    bcmolt_epon_oam_buf bufClone = *buf;
    while (BCMOS_TRUE)
    {
        if (!bcmolt_epon_oam_dpoe_var_container_base_scan(&bufClone, &dummy))
        {
            break;
        }

        count += 1;
    }

    return count;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dpoe_vendor_extended_base_set_request_count_vars(bcmolt_epon_oam_buf *buf)
{
    uint32_t count = 0;
    uint32_t dummy = 0;
    bcmolt_epon_oam_buf bufClone = *buf;
    while (BCMOS_TRUE)
    {
        if (!bcmolt_epon_oam_dpoe_var_container_base_scan(&bufClone, &dummy))
        {
            break;
        }

        count += 1;
    }

    return count;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_dpoe_vendor_extended_base_set_response_count_vars(bcmolt_epon_oam_buf *buf)
{
    uint32_t count = 0;
    uint32_t dummy = 0;
    bcmolt_epon_oam_buf bufClone = *buf;
    while (BCMOS_TRUE)
    {
        if (!bcmolt_epon_oam_dpoe_var_container_base_scan(&bufClone, &dummy))
        {
            break;
        }

        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_version_pack(bcmolt_epon_oam_tls_version *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u8(buf, this->major))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->minor))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_version_unpack(bcmolt_epon_oam_tls_version *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->major))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->minor))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_version_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 2);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_random_pack(bcmolt_epon_oam_tls_random *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u32(buf, this->unix_time))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write(buf, this->random, 28))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_random_unpack(bcmolt_epon_oam_tls_random *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->unix_time))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read(buf, this->random, 28))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_random_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 32);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_session_id_pack(bcmolt_epon_oam_tls_session_id *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u8(buf, this->length))
    {
        return BCMOS_FALSE;
    }

    if ((this->length > 0) && (this->session_id == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"session_id\" of struct \"bcmolt_epon_oam_tls_session_id\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    if (this->length > 32)
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write(buf, this->session_id, this->length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tls_session_id_get_packed_length(bcmolt_epon_oam_tls_session_id *this)
{
    return 1 + this->length;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_session_id_unpack(bcmolt_epon_oam_tls_session_id *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->length))
    {
        return BCMOS_FALSE;
    }

    if ((this->length > 0) && (this->session_id == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"session_id\" of struct \"bcmolt_epon_oam_tls_session_id\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->session_id = (uint8_t *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->length * sizeof(uint8_t));
        }
    }

    if (this->length > 32)
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read(buf, this->session_id, this->length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_session_id_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    uint8_t length;
    if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * length);
    if (!bcmolt_epon_oam_buf_skip(packed, length * 1))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_ciphersuite_list_pack(bcmolt_epon_oam_tls_ciphersuite_list *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t i0;
    if (!bcmolt_epon_oam_buf_write_u16(buf, this->length))
    {
        return BCMOS_FALSE;
    }

    if ((this->length > 0) && (this->ciphersuites == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"ciphersuites\" of struct \"bcmolt_epon_oam_tls_ciphersuite_list\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->length; i0++)
    {
        if (!bcmolt_epon_oam_tls_ciphersuite_pack(this->ciphersuites[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tls_ciphersuite_list_get_packed_length(bcmolt_epon_oam_tls_ciphersuite_list *this)
{
    return 2 + (2 * this->length);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_ciphersuite_list_unpack(bcmolt_epon_oam_tls_ciphersuite_list *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint16_t i0;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->length))
    {
        return BCMOS_FALSE;
    }

    if ((this->length > 0) && (this->ciphersuites == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"ciphersuites\" of struct \"bcmolt_epon_oam_tls_ciphersuite_list\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->ciphersuites = (bcmolt_epon_oam_tls_ciphersuite *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->length * sizeof(bcmolt_epon_oam_tls_ciphersuite));
        }
    }

    for (i0 = 0; i0 < this->length; i0++)
    {
        if (!bcmolt_epon_oam_tls_ciphersuite_unpack(&this->ciphersuites[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_ciphersuite_list_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    uint16_t length;
    if (!bcmolt_epon_oam_buf_read_u16(packed, &length))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_tls_ciphersuite) * length);
    if (!bcmolt_epon_oam_buf_skip(packed, length * 2))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_compression_list_pack(bcmolt_epon_oam_tls_compression_list *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t i0;
    if (!bcmolt_epon_oam_buf_write_u8(buf, this->length))
    {
        return BCMOS_FALSE;
    }

    if ((this->length > 0) && (this->methods == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"methods\" of struct \"bcmolt_epon_oam_tls_compression_list\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->length; i0++)
    {
        if (!bcmolt_epon_oam_tls_compression_method_pack(this->methods[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tls_compression_list_get_packed_length(bcmolt_epon_oam_tls_compression_list *this)
{
    return 1 + this->length;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_compression_list_unpack(bcmolt_epon_oam_tls_compression_list *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint8_t i0;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->length))
    {
        return BCMOS_FALSE;
    }

    if ((this->length > 0) && (this->methods == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"methods\" of struct \"bcmolt_epon_oam_tls_compression_list\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->methods = (bcmolt_epon_oam_tls_compression_method *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->length * sizeof(bcmolt_epon_oam_tls_compression_method));
        }
    }

    for (i0 = 0; i0 < this->length; i0++)
    {
        if (!bcmolt_epon_oam_tls_compression_method_unpack(&this->methods[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_compression_list_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    uint8_t length;
    if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_tls_compression_method) * length);
    if (!bcmolt_epon_oam_buf_skip(packed, length * 1))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_certificate_list_pack(bcmolt_epon_oam_tls_certificate_list *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t preLenFieldPos;
    uint32_t bytesAfterLenField;
    uint32_t i0;
    preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

    /* skip over length field (we'll fill it in later) */
    if (!bcmolt_epon_oam_buf_skip(buf, 3))
    {
        return BCMOS_FALSE;
    }

    if ((this->certificate_list_count > 0) && (this->certificate_list == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"certificate_list\" of struct \"bcmolt_epon_oam_tls_certificate_list\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->certificate_list_count; i0++)
    {
        if (!bcmolt_epon_oam_certificate_pack(&this->certificate_list[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint24_t));
    if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u24(buf, uint32_t_to_uint24_t(bytesAfterLenField)))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint24_t))))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tls_certificate_list_get_packed_length(bcmolt_epon_oam_tls_certificate_list *this)
{
    uint32_t count = 3;
    uint32_t i0;
    if ((this->certificate_list_count > 0) && (this->certificate_list == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"certificate_list_count\" of struct \"bcmolt_epon_oam_tls_certificate_list\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return 0;
    }

    for (i0 = 0; i0 < this->certificate_list_count; i0++)
    {
        count += bcmolt_epon_oam_certificate_get_packed_length(&this->certificate_list[i0]);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_certificate_list_unpack(bcmolt_epon_oam_tls_certificate_list *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint24_t certificate_list_size = uint32_t_to_uint24_t(0);
    bcmolt_epon_oam_buf postLenBuf;
    uint32_t i0;
    if (!bcmolt_epon_oam_buf_read_u24(buf, &certificate_list_size))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, uint24_t_to_uint32_t(certificate_list_size), buf->curr);
    this->certificate_list_count = bcmolt_epon_oam_tls_certificate_list_count_certificate_list(&postLenBuf);
    if ((this->certificate_list_count > 0) && (this->certificate_list == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"certificate_list\" of struct \"bcmolt_epon_oam_tls_certificate_list\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->certificate_list = (bcmolt_epon_oam_certificate *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->certificate_list_count * sizeof(bcmolt_epon_oam_certificate));
        }
    }

    for (i0 = 0; i0 < this->certificate_list_count; i0++)
    {
        if (!bcmolt_epon_oam_certificate_unpack(&this->certificate_list[i0], &postLenBuf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if (!bcmolt_epon_oam_buf_skip(buf, uint24_t_to_uint32_t(certificate_list_size)))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_certificate_list_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_buf postLenBuf;
    uint24_t length;
    uint32_t certificate_list_elem_count = 0;
    if (!bcmolt_epon_oam_buf_read_u24(packed, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, uint24_t_to_uint32_t(length), packed->curr);
    while (BCMOS_TRUE)
    {
        if (!bcmolt_epon_oam_certificate_scan(&postLenBuf, extra_mem))
        {
            break;
        }

        certificate_list_elem_count += 1;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(certificate_list_elem_count * sizeof(bcmolt_epon_oam_certificate));
    if (!bcmolt_epon_oam_buf_skip(packed, uint24_t_to_uint32_t(length)))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tls_certificate_list_count_certificate_list(bcmolt_epon_oam_buf *buf)
{
    uint32_t count = 0;
    uint32_t dummy = 0;
    bcmolt_epon_oam_buf bufClone = *buf;
    while (BCMOS_TRUE)
    {
        if (!bcmolt_epon_oam_certificate_scan(&bufClone, &dummy))
        {
            break;
        }

        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_certificate_type_list_pack(bcmolt_epon_oam_tls_certificate_type_list *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t i0;
    if (!bcmolt_epon_oam_buf_write_u8(buf, this->length))
    {
        return BCMOS_FALSE;
    }

    if ((this->length > 0) && (this->certificate_types == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"certificate_types\" of struct \"bcmolt_epon_oam_tls_certificate_type_list\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->length; i0++)
    {
        if (!bcmolt_epon_oam_tls_certificate_type_pack(this->certificate_types[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tls_certificate_type_list_get_packed_length(bcmolt_epon_oam_tls_certificate_type_list *this)
{
    return 1 + this->length;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_certificate_type_list_unpack(bcmolt_epon_oam_tls_certificate_type_list *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint8_t i0;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->length))
    {
        return BCMOS_FALSE;
    }

    if ((this->length > 0) && (this->certificate_types == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"certificate_types\" of struct \"bcmolt_epon_oam_tls_certificate_type_list\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->certificate_types = (bcmolt_epon_oam_tls_certificate_type *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->length * sizeof(bcmolt_epon_oam_tls_certificate_type));
        }
    }

    for (i0 = 0; i0 < this->length; i0++)
    {
        if (!bcmolt_epon_oam_tls_certificate_type_unpack(&this->certificate_types[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_certificate_type_list_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    uint8_t length;
    if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_tls_certificate_type) * length);
    if (!bcmolt_epon_oam_buf_skip(packed, length * 1))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_handshake_pack(bcmolt_epon_oam_tls_handshake *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t preLenFieldPos;
    uint32_t bytesAfterLenField;
    if (!bcmolt_epon_oam_tls_handshake_type_pack(this->id, buf))
    {
        return BCMOS_FALSE;
    }

    preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

    /* skip over length field (we'll fill it in later) */
    if (!bcmolt_epon_oam_buf_skip(buf, 3))
    {
        return BCMOS_FALSE;
    }

    switch (this->id)
    {
        case BCMOLT_EPON_OAM_TLS_HANDSHAKE_TYPE_CLIENT_HELLO:
            {
                if (!bcmolt_epon_oam_tls_version_pack(&this->u.client_hello.version, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_tls_random_pack(&this->u.client_hello.random, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_tls_session_id_pack(&this->u.client_hello.session_id, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_tls_ciphersuite_list_pack(&this->u.client_hello.cipher_suites, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_tls_compression_list_pack(&this->u.client_hello.compression_methods, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TLS_HANDSHAKE_TYPE_SERVER_HELLO:
            {
                if (!bcmolt_epon_oam_tls_version_pack(&this->u.server_hello.version, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_tls_random_pack(&this->u.server_hello.random, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_tls_session_id_pack(&this->u.server_hello.session_id, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_tls_ciphersuite_pack(this->u.server_hello.ciphersuite, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_tls_compression_method_pack(this->u.server_hello.compression_method, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TLS_HANDSHAKE_TYPE_CERTIFICATE:
            {
                if (!bcmolt_epon_oam_tls_certificate_list_pack(&this->u.certificate.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TLS_HANDSHAKE_TYPE_CERTIFICATE_REQUEST:
            {
                if (!bcmolt_epon_oam_tls_certificate_type_list_pack(&this->u.certificate_request.certificate_types, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_distinguished_name_list_pack(&this->u.certificate_request.certificate_authorities, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TLS_HANDSHAKE_TYPE_CERTIFICATE_VERIFY:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.certificate_verify.hash_size))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.certificate_verify.hash_size > 0) && (this->u.certificate_verify.encrypted_hash == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"encrypted_hash\" of struct \"bcmolt_epon_oam_tls_handshake_certificate_verify\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.certificate_verify.encrypted_hash, this->u.certificate_verify.hash_size))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TLS_HANDSHAKE_TYPE_CLIENT_KEY_EXCHANGE:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.client_key_exchange.size))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.client_key_exchange.size > 0) && (this->u.client_key_exchange.encrypted_pre_master_secret == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"encrypted_pre_master_secret\" of struct \"bcmolt_epon_oam_tls_handshake_client_key_exchange\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.client_key_exchange.encrypted_pre_master_secret, this->u.client_key_exchange.size))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TLS_HANDSHAKE_TYPE_FINISHED:
            {
                if ((this->u.finished.verify_data_count > 0) && (this->u.finished.verify_data == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"verify_data\" of struct \"bcmolt_epon_oam_tls_handshake_finished\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.finished.verify_data, this->u.finished.verify_data_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TLS_HANDSHAKE_TYPE_HELLO_REQUEST:
        case BCMOLT_EPON_OAM_TLS_HANDSHAKE_TYPE_SERVER_KEY_EXCHANGE:
        default:
            {
            }
            break;
    }

    bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint24_t));
    if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u24(buf, uint32_t_to_uint24_t(bytesAfterLenField)))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint24_t))))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tls_handshake_get_packed_length(bcmolt_epon_oam_tls_handshake *this)
{
    uint32_t count = 4;
    switch (this->id)
    {
        case BCMOLT_EPON_OAM_TLS_HANDSHAKE_TYPE_CLIENT_HELLO:
            {
                count += 34 + bcmolt_epon_oam_tls_session_id_get_packed_length(&this->u.client_hello.session_id) + bcmolt_epon_oam_tls_ciphersuite_list_get_packed_length(&this->u.client_hello.cipher_suites) + bcmolt_epon_oam_tls_compression_list_get_packed_length(&this->u.client_hello.compression_methods);
            }
            break;
        case BCMOLT_EPON_OAM_TLS_HANDSHAKE_TYPE_SERVER_HELLO:
            {
                count += 37 + bcmolt_epon_oam_tls_session_id_get_packed_length(&this->u.server_hello.session_id);
            }
            break;
        case BCMOLT_EPON_OAM_TLS_HANDSHAKE_TYPE_CERTIFICATE:
            {
                count += bcmolt_epon_oam_tls_certificate_list_get_packed_length(&this->u.certificate.value);
            }
            break;
        case BCMOLT_EPON_OAM_TLS_HANDSHAKE_TYPE_CERTIFICATE_REQUEST:
            {
                count += bcmolt_epon_oam_tls_certificate_type_list_get_packed_length(&this->u.certificate_request.certificate_types) + bcmolt_epon_oam_distinguished_name_list_get_packed_length(&this->u.certificate_request.certificate_authorities);
            }
            break;
        case BCMOLT_EPON_OAM_TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TLS_HANDSHAKE_TYPE_CERTIFICATE_VERIFY:
            {
                count += 2 + this->u.certificate_verify.hash_size;
            }
            break;
        case BCMOLT_EPON_OAM_TLS_HANDSHAKE_TYPE_CLIENT_KEY_EXCHANGE:
            {
                count += 2 + this->u.client_key_exchange.size;
            }
            break;
        case BCMOLT_EPON_OAM_TLS_HANDSHAKE_TYPE_FINISHED:
            {
                count += this->u.finished.verify_data_count;
            }
            break;
        case BCMOLT_EPON_OAM_TLS_HANDSHAKE_TYPE_HELLO_REQUEST:
        case BCMOLT_EPON_OAM_TLS_HANDSHAKE_TYPE_SERVER_KEY_EXCHANGE:
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_handshake_unpack(bcmolt_epon_oam_tls_handshake *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint24_t length = uint32_t_to_uint24_t(0);
    bcmolt_epon_oam_buf postLenBuf;
    if (!bcmolt_epon_oam_tls_handshake_type_unpack(&this->id, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u24(buf, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, uint24_t_to_uint32_t(length), buf->curr);
    switch (this->id)
    {
        case BCMOLT_EPON_OAM_TLS_HANDSHAKE_TYPE_CLIENT_HELLO:
            {
                if (!bcmolt_epon_oam_tls_version_unpack(&this->u.client_hello.version, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_tls_random_unpack(&this->u.client_hello.random, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_tls_session_id_unpack(&this->u.client_hello.session_id, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_tls_ciphersuite_list_unpack(&this->u.client_hello.cipher_suites, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_tls_compression_list_unpack(&this->u.client_hello.compression_methods, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TLS_HANDSHAKE_TYPE_SERVER_HELLO:
            {
                if (!bcmolt_epon_oam_tls_version_unpack(&this->u.server_hello.version, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_tls_random_unpack(&this->u.server_hello.random, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_tls_session_id_unpack(&this->u.server_hello.session_id, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_tls_ciphersuite_unpack(&this->u.server_hello.ciphersuite, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_tls_compression_method_unpack(&this->u.server_hello.compression_method, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TLS_HANDSHAKE_TYPE_CERTIFICATE:
            {
                if (!bcmolt_epon_oam_tls_certificate_list_unpack(&this->u.certificate.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TLS_HANDSHAKE_TYPE_CERTIFICATE_REQUEST:
            {
                if (!bcmolt_epon_oam_tls_certificate_type_list_unpack(&this->u.certificate_request.certificate_types, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_distinguished_name_list_unpack(&this->u.certificate_request.certificate_authorities, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TLS_HANDSHAKE_TYPE_CERTIFICATE_VERIFY:
            {
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.certificate_verify.hash_size))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.certificate_verify.hash_size > 0) && (this->u.certificate_verify.encrypted_hash == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"encrypted_hash\" of struct \"bcmolt_epon_oam_tls_handshake_certificate_verify\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.certificate_verify.encrypted_hash = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.certificate_verify.hash_size * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.certificate_verify.encrypted_hash, this->u.certificate_verify.hash_size))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TLS_HANDSHAKE_TYPE_CLIENT_KEY_EXCHANGE:
            {
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.client_key_exchange.size))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.client_key_exchange.size > 0) && (this->u.client_key_exchange.encrypted_pre_master_secret == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"encrypted_pre_master_secret\" of struct \"bcmolt_epon_oam_tls_handshake_client_key_exchange\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.client_key_exchange.encrypted_pre_master_secret = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.client_key_exchange.size * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.client_key_exchange.encrypted_pre_master_secret, this->u.client_key_exchange.size))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TLS_HANDSHAKE_TYPE_FINISHED:
            {
                this->u.finished.verify_data_count = bcmolt_epon_oam_tls_handshake_finished_count_verify_data(&postLenBuf);
                if ((this->u.finished.verify_data_count > 0) && (this->u.finished.verify_data == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"verify_data\" of struct \"bcmolt_epon_oam_tls_handshake_finished\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.finished.verify_data = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.finished.verify_data_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.finished.verify_data, this->u.finished.verify_data_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TLS_HANDSHAKE_TYPE_HELLO_REQUEST:
        case BCMOLT_EPON_OAM_TLS_HANDSHAKE_TYPE_SERVER_KEY_EXCHANGE:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(buf, uint24_t_to_uint32_t(length)))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_handshake_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_tls_handshake_type id;
    bcmolt_epon_oam_buf postLenBuf;
    uint24_t length;
    if (!bcmolt_epon_oam_tls_handshake_type_unpack(&id, packed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u24(packed, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, uint24_t_to_uint32_t(length), packed->curr);
    switch (id)
    {
        case BCMOLT_EPON_OAM_TLS_HANDSHAKE_TYPE_CLIENT_HELLO:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 32))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_tls_session_id_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_tls_ciphersuite_list_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_tls_compression_list_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TLS_HANDSHAKE_TYPE_SERVER_HELLO:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 32))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_tls_session_id_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TLS_HANDSHAKE_TYPE_CERTIFICATE:
            {
                if (!bcmolt_epon_oam_tls_certificate_list_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TLS_HANDSHAKE_TYPE_CERTIFICATE_REQUEST:
            {
                if (!bcmolt_epon_oam_tls_certificate_type_list_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_distinguished_name_list_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TLS_HANDSHAKE_TYPE_CERTIFICATE_VERIFY:
            {
                uint16_t hash_size;
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &hash_size))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * hash_size);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, hash_size * 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TLS_HANDSHAKE_TYPE_CLIENT_KEY_EXCHANGE:
            {
                uint16_t size;
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &size))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * size);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, size * 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TLS_HANDSHAKE_TYPE_FINISHED:
            {
                uint32_t verify_data_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                    {
                        break;
                    }

                    verify_data_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(verify_data_elem_count * sizeof(uint8_t));
            }
            break;
        case BCMOLT_EPON_OAM_TLS_HANDSHAKE_TYPE_HELLO_REQUEST:
        case BCMOLT_EPON_OAM_TLS_HANDSHAKE_TYPE_SERVER_KEY_EXCHANGE:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, uint24_t_to_uint32_t(length)))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tls_handshake_finished_count_verify_data(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_record_pack(bcmolt_epon_oam_tls_record *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t preLenFieldPos;
    uint32_t bytesAfterLenField;
    if (!bcmolt_epon_oam_tls_content_type_pack(this->content_type, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_tls_version_pack(&this->version, buf))
    {
        return BCMOS_FALSE;
    }

    preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

    /* skip over length field (we'll fill it in later) */
    if (!bcmolt_epon_oam_buf_skip(buf, 2))
    {
        return BCMOS_FALSE;
    }

    switch (this->content_type)
    {
        case BCMOLT_EPON_OAM_TLS_CONTENT_TYPE_HANDSHAKE:
            {
                uint32_t i0;
                if ((this->u.handshake.handshake_records_count > 0) && (this->u.handshake.handshake_records == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"handshake_records\" of struct \"bcmolt_epon_oam_tls_record_handshake\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i0 = 0; i0 < this->u.handshake.handshake_records_count; i0++)
                {
                    if (!bcmolt_epon_oam_tls_handshake_pack(&this->u.handshake.handshake_records[i0], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_TLS_CONTENT_TYPE_ALERT:
        case BCMOLT_EPON_OAM_TLS_CONTENT_TYPE_APPLICATION_DATA:
        case BCMOLT_EPON_OAM_TLS_CONTENT_TYPE_CHANGE_CIPHER_SPEC:
        default:
            {
            }
            break;
    }

    bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint16_t));
    if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, bytesAfterLenField))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint16_t))))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tls_record_get_packed_length(bcmolt_epon_oam_tls_record *this)
{
    uint32_t count = 5;
    switch (this->content_type)
    {
        case BCMOLT_EPON_OAM_TLS_CONTENT_TYPE_HANDSHAKE:
            {
                uint32_t i0;
                if ((this->u.handshake.handshake_records_count > 0) && (this->u.handshake.handshake_records == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"handshake_records_count\" of struct \"bcmolt_epon_oam_tls_record\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return 0;
                }

                for (i0 = 0; i0 < this->u.handshake.handshake_records_count; i0++)
                {
                    count += bcmolt_epon_oam_tls_handshake_get_packed_length(&this->u.handshake.handshake_records[i0]);
                }
            }
            break;
        case BCMOLT_EPON_OAM_TLS_CONTENT_TYPE_ALERT:
        case BCMOLT_EPON_OAM_TLS_CONTENT_TYPE_APPLICATION_DATA:
        case BCMOLT_EPON_OAM_TLS_CONTENT_TYPE_CHANGE_CIPHER_SPEC:
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_record_unpack(bcmolt_epon_oam_tls_record *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint16_t length = 0;
    bcmolt_epon_oam_buf postLenBuf;
    if (!bcmolt_epon_oam_tls_content_type_unpack(&this->content_type, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_tls_version_unpack(&this->version, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, buf->curr);
    switch (this->content_type)
    {
        case BCMOLT_EPON_OAM_TLS_CONTENT_TYPE_HANDSHAKE:
            {
                uint32_t i0;
                this->u.handshake.handshake_records_count = bcmolt_epon_oam_tls_record_handshake_count_handshake_records(&postLenBuf);
                if ((this->u.handshake.handshake_records_count > 0) && (this->u.handshake.handshake_records == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"handshake_records\" of struct \"bcmolt_epon_oam_tls_record_handshake\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.handshake.handshake_records = (bcmolt_epon_oam_tls_handshake *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.handshake.handshake_records_count * sizeof(bcmolt_epon_oam_tls_handshake));
                    }
                }

                for (i0 = 0; i0 < this->u.handshake.handshake_records_count; i0++)
                {
                    if (!bcmolt_epon_oam_tls_handshake_unpack(&this->u.handshake.handshake_records[i0], &postLenBuf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_TLS_CONTENT_TYPE_ALERT:
        case BCMOLT_EPON_OAM_TLS_CONTENT_TYPE_APPLICATION_DATA:
        case BCMOLT_EPON_OAM_TLS_CONTENT_TYPE_CHANGE_CIPHER_SPEC:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(buf, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_record_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_tls_content_type content_type;
    bcmolt_epon_oam_buf postLenBuf;
    uint16_t length;
    if (!bcmolt_epon_oam_tls_content_type_unpack(&content_type, packed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 2))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(packed, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, packed->curr);
    switch (content_type)
    {
        case BCMOLT_EPON_OAM_TLS_CONTENT_TYPE_HANDSHAKE:
            {
                uint32_t handshake_records_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_tls_handshake_scan(&postLenBuf, extra_mem))
                    {
                        break;
                    }

                    handshake_records_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(handshake_records_elem_count * sizeof(bcmolt_epon_oam_tls_handshake));
            }
            break;
        case BCMOLT_EPON_OAM_TLS_CONTENT_TYPE_ALERT:
        case BCMOLT_EPON_OAM_TLS_CONTENT_TYPE_APPLICATION_DATA:
        case BCMOLT_EPON_OAM_TLS_CONTENT_TYPE_CHANGE_CIPHER_SPEC:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tls_record_handshake_count_handshake_records(bcmolt_epon_oam_buf *buf)
{
    uint32_t count = 0;
    uint32_t dummy = 0;
    bcmolt_epon_oam_buf bufClone = *buf;
    while (BCMOS_TRUE)
    {
        if (!bcmolt_epon_oam_tls_handshake_scan(&bufClone, &dummy))
        {
            break;
        }

        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_eap_tls_message_pack(bcmolt_epon_oam_eap_tls_message *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_tls_flags_pack(this->flags, buf))
    {
        return BCMOS_FALSE;
    }

    if ((((uint64_t) this->flags & 0x0080) == 0x0080))
    {
        if (!bcmolt_epon_oam_buf_write_u32(buf, this->length))
        {
            return BCMOS_FALSE;
        }
    }

    if (((((uint64_t) this->flags & 0x0080) == 0x0080) && (((uint64_t) this->flags & 0x0040) == 0)))
    {
        if ((this->tls_records_count > 0) && (this->tls_records == NULL))
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"tls_records\" of struct \"bcmolt_epon_oam_eap_tls_message\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }

        uint32_t i0;
        for (i0 = 0; i0 < this->tls_records_count; i0++)
        {
            if (!bcmolt_epon_oam_tls_record_pack(&this->tls_records[i0], buf))
            {
                return BCMOS_FALSE;
            }
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_eap_tls_message_get_packed_length(bcmolt_epon_oam_eap_tls_message *this)
{
    uint32_t count = 5;
    uint32_t i0;
    if ((this->tls_records_count > 0) && (this->tls_records == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"tls_records_count\" of struct \"bcmolt_epon_oam_eap_tls_message\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return 0;
    }

    for (i0 = 0; i0 < this->tls_records_count; i0++)
    {
        count += bcmolt_epon_oam_tls_record_get_packed_length(&this->tls_records[i0]);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_eap_tls_message_unpack(bcmolt_epon_oam_eap_tls_message *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_tls_flags_unpack(&this->flags, buf))
    {
        return BCMOS_FALSE;
    }

    if ((((uint64_t) this->flags & 0x0080) == 0x0080))
    {
        if (!bcmolt_epon_oam_buf_read_u32(buf, &this->length))
        {
            return BCMOS_FALSE;
        }
    }

    if (((((uint64_t) this->flags & 0x0080) == 0x0080) && (((uint64_t) this->flags & 0x0040) == 0)))
    {
        this->tls_records_count = bcmolt_epon_oam_eap_tls_message_count_tls_records(buf);
        if ((this->tls_records_count > 0) && (this->tls_records == NULL))
        {
            if (extra_mem == NULL)
            {
                bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"tls_records\" of struct \"bcmolt_epon_oam_eap_tls_message\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                return BCMOS_FALSE;
            }
            else
            {
                this->tls_records = (bcmolt_epon_oam_tls_record *) *extra_mem;
                *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->tls_records_count * sizeof(bcmolt_epon_oam_tls_record));
            }
        }

        uint32_t i0;
        for (i0 = 0; i0 < this->tls_records_count; i0++)
        {
            if (!bcmolt_epon_oam_tls_record_unpack(&this->tls_records[i0], buf, extra_mem))
            {
                return BCMOS_FALSE;
            }
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_eap_tls_message_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    uint32_t tls_records_elem_count = 0;
    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 4))
    {
        return BCMOS_FALSE;
    }

    while (BCMOS_TRUE)
    {
        if (!bcmolt_epon_oam_tls_record_scan(packed, extra_mem))
        {
            break;
        }

        tls_records_elem_count += 1;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(tls_records_elem_count * sizeof(bcmolt_epon_oam_tls_record));
    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_eap_tls_message_count_tls_records(bcmolt_epon_oam_buf *buf)
{
    uint32_t count = 0;
    uint32_t dummy = 0;
    bcmolt_epon_oam_buf bufClone = *buf;
    while (BCMOS_TRUE)
    {
        if (!bcmolt_epon_oam_tls_record_scan(&bufClone, &dummy))
        {
            break;
        }

        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_eap_tls_header_pack(bcmolt_epon_oam_eap_tls_header *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_tls_subtype_pack(this->sub_type, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->sub_type)
    {
        case BCMOLT_EPON_OAM_TLS_SUBTYPE_AUTHENTICATION:
            {
                if (!bcmolt_epon_oam_eap_tls_message_pack(&this->u.authentication.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_eap_tls_header_get_packed_length(bcmolt_epon_oam_eap_tls_header *this)
{
    uint32_t count = 1;
    switch (this->sub_type)
    {
        case BCMOLT_EPON_OAM_TLS_SUBTYPE_AUTHENTICATION:
            {
                count += bcmolt_epon_oam_eap_tls_message_get_packed_length(&this->u.authentication.value);
            }
            break;
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_eap_tls_header_unpack(bcmolt_epon_oam_eap_tls_header *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_tls_subtype_unpack(&this->sub_type, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->sub_type)
    {
        case BCMOLT_EPON_OAM_TLS_SUBTYPE_AUTHENTICATION:
            {
                if (!bcmolt_epon_oam_eap_tls_message_unpack(&this->u.authentication.value, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_eap_tls_header_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_tls_subtype sub_type;
    if (!bcmolt_epon_oam_tls_subtype_unpack(&sub_type, packed))
    {
        return BCMOS_FALSE;
    }

    switch (sub_type)
    {
        case BCMOLT_EPON_OAM_TLS_SUBTYPE_AUTHENTICATION:
            {
                if (!bcmolt_epon_oam_eap_tls_message_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_eap_frame_pack(bcmolt_epon_oam_eap_frame *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t preLenFieldPos;
    uint32_t bytesAfterLenField;
    if (!bcmolt_epon_oam_eap_code_pack(this->code, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->id))
    {
        return BCMOS_FALSE;
    }

    preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

    /* skip over length field (we'll fill it in later) */
    if (!bcmolt_epon_oam_buf_skip(buf, 2))
    {
        return BCMOS_FALSE;
    }

    switch (this->code)
    {
        case BCMOLT_EPON_OAM_EAP_CODE_REQUEST:
            {
                if (!bcmolt_epon_oam_eap_tls_header_pack(&this->u.request.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_EAP_CODE_RESPONSE:
            {
                if (!bcmolt_epon_oam_eap_tls_header_pack(&this->u.response.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_EAP_CODE_FAILURE:
        case BCMOLT_EPON_OAM_EAP_CODE_SUCCESS:
        default:
            {
            }
            break;
    }

    bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint16_t));
    if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, bytesAfterLenField + 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint16_t))))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_eap_frame_get_packed_length(bcmolt_epon_oam_eap_frame *this)
{
    uint32_t count = 4;
    switch (this->code)
    {
        case BCMOLT_EPON_OAM_EAP_CODE_REQUEST:
            {
                count += bcmolt_epon_oam_eap_tls_header_get_packed_length(&this->u.request.value);
            }
            break;
        case BCMOLT_EPON_OAM_EAP_CODE_RESPONSE:
            {
                count += bcmolt_epon_oam_eap_tls_header_get_packed_length(&this->u.response.value);
            }
            break;
        case BCMOLT_EPON_OAM_EAP_CODE_FAILURE:
        case BCMOLT_EPON_OAM_EAP_CODE_SUCCESS:
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_eap_frame_unpack(bcmolt_epon_oam_eap_frame *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint16_t length = 0;
    bcmolt_epon_oam_buf postLenBuf;
    if (!bcmolt_epon_oam_eap_code_unpack(&this->code, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length - 4, buf->curr);
    switch (this->code)
    {
        case BCMOLT_EPON_OAM_EAP_CODE_REQUEST:
            {
                if (!bcmolt_epon_oam_eap_tls_header_unpack(&this->u.request.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_EAP_CODE_RESPONSE:
            {
                if (!bcmolt_epon_oam_eap_tls_header_unpack(&this->u.response.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_EAP_CODE_FAILURE:
        case BCMOLT_EPON_OAM_EAP_CODE_SUCCESS:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(buf, length - 4))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_eap_frame_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_eap_code code;
    bcmolt_epon_oam_buf postLenBuf;
    uint16_t length;
    if (!bcmolt_epon_oam_eap_code_unpack(&code, packed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(packed, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length - 4, packed->curr);
    switch (code)
    {
        case BCMOLT_EPON_OAM_EAP_CODE_REQUEST:
            {
                if (!bcmolt_epon_oam_eap_tls_header_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_EAP_CODE_RESPONSE:
            {
                if (!bcmolt_epon_oam_eap_tls_header_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_EAP_CODE_FAILURE:
        case BCMOLT_EPON_OAM_EAP_CODE_SUCCESS:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, length - 4))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_eapol_pdu_pack(bcmolt_epon_oam_eapol_pdu *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t preLenFieldPos;
    uint32_t bytesAfterLenField;
    if (!bcmolt_epon_oam_eapol_type_pack(this->type, buf))
    {
        return BCMOS_FALSE;
    }

    preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

    /* skip over length field (we'll fill it in later) */
    if (!bcmolt_epon_oam_buf_skip(buf, 2))
    {
        return BCMOS_FALSE;
    }

    switch (this->type)
    {
        case BCMOLT_EPON_OAM_EAPOL_TYPE_PACKET:
            {
                if (!bcmolt_epon_oam_eap_frame_pack(&this->u.packet.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_EAPOL_TYPE_ASF_ALERT:
        case BCMOLT_EPON_OAM_EAPOL_TYPE_KEY:
        case BCMOLT_EPON_OAM_EAPOL_TYPE_LOGOFF:
        case BCMOLT_EPON_OAM_EAPOL_TYPE_MKA:
        case BCMOLT_EPON_OAM_EAPOL_TYPE_START:
        default:
            {
            }
            break;
    }

    bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint16_t));
    if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, bytesAfterLenField))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint16_t))))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_eapol_pdu_get_packed_length(bcmolt_epon_oam_eapol_pdu *this)
{
    uint32_t count = 3;
    switch (this->type)
    {
        case BCMOLT_EPON_OAM_EAPOL_TYPE_PACKET:
            {
                count += bcmolt_epon_oam_eap_frame_get_packed_length(&this->u.packet.value);
            }
            break;
        case BCMOLT_EPON_OAM_EAPOL_TYPE_ASF_ALERT:
        case BCMOLT_EPON_OAM_EAPOL_TYPE_KEY:
        case BCMOLT_EPON_OAM_EAPOL_TYPE_LOGOFF:
        case BCMOLT_EPON_OAM_EAPOL_TYPE_MKA:
        case BCMOLT_EPON_OAM_EAPOL_TYPE_START:
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_eapol_pdu_unpack(bcmolt_epon_oam_eapol_pdu *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint16_t length = 0;
    bcmolt_epon_oam_buf postLenBuf;
    if (!bcmolt_epon_oam_eapol_type_unpack(&this->type, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, buf->curr);
    switch (this->type)
    {
        case BCMOLT_EPON_OAM_EAPOL_TYPE_PACKET:
            {
                if (!bcmolt_epon_oam_eap_frame_unpack(&this->u.packet.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_EAPOL_TYPE_ASF_ALERT:
        case BCMOLT_EPON_OAM_EAPOL_TYPE_KEY:
        case BCMOLT_EPON_OAM_EAPOL_TYPE_LOGOFF:
        case BCMOLT_EPON_OAM_EAPOL_TYPE_MKA:
        case BCMOLT_EPON_OAM_EAPOL_TYPE_START:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(buf, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_eapol_pdu_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_eapol_type type;
    bcmolt_epon_oam_buf postLenBuf;
    uint16_t length;
    if (!bcmolt_epon_oam_eapol_type_unpack(&type, packed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(packed, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, packed->curr);
    switch (type)
    {
        case BCMOLT_EPON_OAM_EAPOL_TYPE_PACKET:
            {
                if (!bcmolt_epon_oam_eap_frame_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_EAPOL_TYPE_ASF_ALERT:
        case BCMOLT_EPON_OAM_EAPOL_TYPE_KEY:
        case BCMOLT_EPON_OAM_EAPOL_TYPE_LOGOFF:
        case BCMOLT_EPON_OAM_EAPOL_TYPE_MKA:
        case BCMOLT_EPON_OAM_EAPOL_TYPE_START:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_eapol_protocol_pack(bcmolt_epon_oam_eapol_protocol *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_eapol_version_pack(this->version, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->version)
    {
        case BCMOLT_EPON_OAM_EAPOL_VERSION_VERSION2:
        default:
            {
                if (!bcmolt_epon_oam_eapol_pdu_pack(&this->u.def.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_eapol_protocol_get_packed_length(bcmolt_epon_oam_eapol_protocol *this)
{
    uint32_t count = 1;
    switch (this->version)
    {
        case BCMOLT_EPON_OAM_EAPOL_VERSION_VERSION2:
        default:
            {
                count += bcmolt_epon_oam_eapol_pdu_get_packed_length(&this->u.def.value);
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_eapol_protocol_unpack(bcmolt_epon_oam_eapol_protocol *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_eapol_version_unpack(&this->version, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->version)
    {
        case BCMOLT_EPON_OAM_EAPOL_VERSION_VERSION2:
        default:
            {
                if (!bcmolt_epon_oam_eapol_pdu_unpack(&this->u.def.value, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_eapol_protocol_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_eapol_version version;
    if (!bcmolt_epon_oam_eapol_version_unpack(&version, packed))
    {
        return BCMOS_FALSE;
    }

    switch (version)
    {
        case BCMOLT_EPON_OAM_EAPOL_VERSION_VERSION2:
        default:
            {
                if (!bcmolt_epon_oam_eapol_pdu_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_vlan_value_pack(bcmolt_epon_oam_vlan_value *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t ret = 0;
    ret |= ((this->pcp & 0x0007) << 13);
    ret |= ((this->cfi & 0x0001) << 12);
    ret |= (this->vid & 0x0FFF);
    if (!bcmolt_epon_oam_buf_write_u16(buf, ret))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_vlan_value_unpack(bcmolt_epon_oam_vlan_value *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint16_t val;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &val))
    {
        return BCMOS_FALSE;
    }

    this->pcp = ((val >> 13) & 0x0007);
    this->cfi = ((val >> 12) & 0x0001);
    this->vid = (val & 0x0FFF);
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_vlan_value_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 2);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_itag_value_pack(bcmolt_epon_oam_itag_value *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t ret = 0;
    ret |= ((this->pcp & 0x0007) << 29);
    ret |= ((this->dei & 0x0001) << 28);
    ret |= ((this->uca & 0x0001) << 27);
    ret |= ((this->res & 0x0007) << 24);
    ret |= (this->isid & 0x00FFFFFFUL);
    if (!bcmolt_epon_oam_buf_write_u32(buf, ret))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_itag_value_unpack(bcmolt_epon_oam_itag_value *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint32_t val;
    if (!bcmolt_epon_oam_buf_read_u32(buf, &val))
    {
        return BCMOS_FALSE;
    }

    this->pcp = ((val >> 29) & 0x0007);
    this->dei = ((val >> 28) & 0x0001);
    this->uca = ((val >> 27) & 0x0001);
    this->res = ((val >> 24) & 0x0007);
    this->isid = (val & 0x00FFFFFFUL);
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_itag_value_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 4);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_info_tlv_pack(bcmolt_epon_oam_tek_info_tlv *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_tek_info_tlv_type_pack(this->type, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->type)
    {
        case BCMOLT_EPON_OAM_TEK_INFO_TLV_TYPE_ALARM_REQUEST:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TEK_INFO_TLV_TYPE_EXTENSION_SUPPORT:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.extension_support.version))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_tek_report_modes_pack(this->u.extension_support.report_mode, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_tek_report_modes_pack(this->u.extension_support.preferred_report_mode, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_INFO_TLV_TYPE_KEY:
        case BCMOLT_EPON_OAM_TEK_INFO_TLV_TYPE_LINK:
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tek_info_tlv_get_packed_length(bcmolt_epon_oam_tek_info_tlv *this)
{
    uint32_t count = 1;
    switch (this->type)
    {
        case BCMOLT_EPON_OAM_TEK_INFO_TLV_TYPE_ALARM_REQUEST:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TEK_INFO_TLV_TYPE_EXTENSION_SUPPORT:
            {
                count += 3;
            }
            break;
        case BCMOLT_EPON_OAM_TEK_INFO_TLV_TYPE_KEY:
        case BCMOLT_EPON_OAM_TEK_INFO_TLV_TYPE_LINK:
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_info_tlv_unpack(bcmolt_epon_oam_tek_info_tlv *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_tek_info_tlv_type_unpack(&this->type, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->type)
    {
        case BCMOLT_EPON_OAM_TEK_INFO_TLV_TYPE_ALARM_REQUEST:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TEK_INFO_TLV_TYPE_EXTENSION_SUPPORT:
            {
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.extension_support.version))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_tek_report_modes_unpack(&this->u.extension_support.report_mode, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_tek_report_modes_unpack(&this->u.extension_support.preferred_report_mode, buf))
                {
                    /*Optional unpack fails do not cause errors */
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_INFO_TLV_TYPE_KEY:
        case BCMOLT_EPON_OAM_TEK_INFO_TLV_TYPE_LINK:
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_info_tlv_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_tek_info_tlv_type type;
    if (!bcmolt_epon_oam_tek_info_tlv_type_unpack(&type, packed))
    {
        return BCMOS_FALSE;
    }

    switch (type)
    {
        case BCMOLT_EPON_OAM_TEK_INFO_TLV_TYPE_ALARM_REQUEST:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TEK_INFO_TLV_TYPE_EXTENSION_SUPPORT:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    /*Optional unpack fails do not cause errors */
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_INFO_TLV_TYPE_KEY:
        case BCMOLT_EPON_OAM_TEK_INFO_TLV_TYPE_LINK:
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_organization_specific_info_pack(bcmolt_epon_oam_organization_specific_info *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t preLenFieldPos;
    uint32_t bytesAfterLenField;
    preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

    /* skip over length field (we'll fill it in later) */
    if (!bcmolt_epon_oam_buf_skip(buf, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_well_known_oui_pack(this->oui, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->oui)
    {
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_TEK:
            {
                if (!bcmolt_epon_oam_tek_info_tlv_pack(&this->u.tek.tlvs, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_CTC:
            {
                uint32_t i0;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.ctc.extension_support))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.ctc.version))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.ctc.supp_version_count > 0) && (this->u.ctc.supp_version == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"supp_version\" of struct \"bcmolt_epon_oam_organization_specific_info_ctc\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i0 = 0; i0 < this->u.ctc.supp_version_count; i0++)
                {
                    if (!bcmolt_epon_oam_ctc_oui_version_pair_pack(&this->u.ctc.supp_version[i0], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DPOE:
            {
                if (!bcmolt_epon_oam_dpoe_info_tlv_pack(&this->u.dpoe.dpoe_info_tlv, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_BRCM:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DASAN:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_KT:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_PMC:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_SIEPON_A:
        default:
            {
            }
            break;
    }

    bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
    if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, bytesAfterLenField + 2))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_organization_specific_info_get_packed_length(bcmolt_epon_oam_organization_specific_info *this)
{
    uint32_t count = 4;
    switch (this->oui)
    {
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_TEK:
            {
                count += bcmolt_epon_oam_tek_info_tlv_get_packed_length(&this->u.tek.tlvs);
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_CTC:
            {
                count += 2 + (4 * this->u.ctc.supp_version_count);
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DPOE:
            {
                count += bcmolt_epon_oam_dpoe_info_tlv_get_packed_length(&this->u.dpoe.dpoe_info_tlv);
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_BRCM:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DASAN:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_KT:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_PMC:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_SIEPON_A:
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_organization_specific_info_unpack(bcmolt_epon_oam_organization_specific_info *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint8_t length = 0;
    bcmolt_epon_oam_buf postLenBuf;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length - 2, buf->curr);
    if (!bcmolt_epon_oam_well_known_oui_unpack(&this->oui, &postLenBuf))
    {
        return BCMOS_FALSE;
    }

    switch (this->oui)
    {
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_TEK:
            {
                if (!bcmolt_epon_oam_tek_info_tlv_unpack(&this->u.tek.tlvs, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_CTC:
            {
                uint32_t i0;
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.ctc.extension_support))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.ctc.version))
                {
                    return BCMOS_FALSE;
                }

                this->u.ctc.supp_version_count = bcmolt_epon_oam_organization_specific_info_ctc_count_supp_version(&postLenBuf);
                if ((this->u.ctc.supp_version_count > 0) && (this->u.ctc.supp_version == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"supp_version\" of struct \"bcmolt_epon_oam_organization_specific_info_ctc\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.ctc.supp_version = (bcmolt_epon_oam_ctc_oui_version_pair *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.ctc.supp_version_count * sizeof(bcmolt_epon_oam_ctc_oui_version_pair));
                    }
                }

                for (i0 = 0; i0 < this->u.ctc.supp_version_count; i0++)
                {
                    if (!bcmolt_epon_oam_ctc_oui_version_pair_unpack(&this->u.ctc.supp_version[i0], &postLenBuf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DPOE:
            {
                if (!bcmolt_epon_oam_dpoe_info_tlv_unpack(&this->u.dpoe.dpoe_info_tlv, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_BRCM:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DASAN:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_KT:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_PMC:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_SIEPON_A:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(buf, length - 2))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_organization_specific_info_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_buf postLenBuf;
    uint8_t length;
    bcmolt_epon_oam_well_known_oui oui;
    if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length - 2, packed->curr);
    if (!bcmolt_epon_oam_well_known_oui_unpack(&oui, &postLenBuf))
    {
        return BCMOS_FALSE;
    }

    switch (oui)
    {
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_TEK:
            {
                if (!bcmolt_epon_oam_tek_info_tlv_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_CTC:
            {
                uint32_t supp_version_elem_count = 0;
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                    {
                        break;
                    }

                    supp_version_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(supp_version_elem_count * sizeof(bcmolt_epon_oam_ctc_oui_version_pair));
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DPOE:
            {
                if (!bcmolt_epon_oam_dpoe_info_tlv_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_BRCM:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DASAN:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_KT:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_PMC:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_SIEPON_A:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, length - 2))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_organization_specific_info_ctc_count_supp_version(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 4);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_local_remote_info_pack(bcmolt_epon_oam_local_remote_info *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t preLenFieldPos;
    uint32_t bytesAfterLenField;
    preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

    /* skip over length field (we'll fill it in later) */
    if (!bcmolt_epon_oam_buf_skip(buf, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->oam_version))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->revision))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_local_remote_info_state_pack(this->state, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_local_remote_info_config_pack(this->oam_config, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->max_pdu_size))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_well_known_oui_pack(this->oui, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write(buf, this->vendor_specific_information, 4))
    {
        return BCMOS_FALSE;
    }

    bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
    if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, bytesAfterLenField + 2))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_local_remote_info_unpack(bcmolt_epon_oam_local_remote_info *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint8_t length = 0;
    bcmolt_epon_oam_buf postLenBuf;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length - 2, buf->curr);
    if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->oam_version))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->revision))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_local_remote_info_state_unpack(&this->state, &postLenBuf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_local_remote_info_config_unpack(&this->oam_config, &postLenBuf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->max_pdu_size))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_well_known_oui_unpack(&this->oui, &postLenBuf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->vendor_specific_information, 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(buf, length - 2))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_local_remote_info_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 15);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_info_tlv_base_pack(bcmolt_epon_oam_info_tlv_base *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_info_tlv_type_pack(this->type, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->type)
    {
        case BCMOLT_EPON_OAM_INFO_TLV_TYPE_ORGANIZATION_SPECIFIC:
            {
                if (!bcmolt_epon_oam_organization_specific_info_pack(&this->u.organization_specific.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_INFO_TLV_TYPE_END:
            {
                if ((this->u.end.unknown_count > 0) && (this->u.end.unknown == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"unknown\" of struct \"bcmolt_epon_oam_info_tlv_base_end\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.end.unknown, this->u.end.unknown_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_INFO_TLV_TYPE_REMOTE:
            {
                if (!bcmolt_epon_oam_local_remote_info_pack(&this->u.remote.info, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_INFO_TLV_TYPE_LOCAL:
            {
                if (!bcmolt_epon_oam_local_remote_info_pack(&this->u.local.info, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_info_tlv_base_get_packed_length(bcmolt_epon_oam_info_tlv_base *this)
{
    uint32_t count = 1;
    switch (this->type)
    {
        case BCMOLT_EPON_OAM_INFO_TLV_TYPE_ORGANIZATION_SPECIFIC:
            {
                count += bcmolt_epon_oam_organization_specific_info_get_packed_length(&this->u.organization_specific.value);
            }
            break;
        case BCMOLT_EPON_OAM_INFO_TLV_TYPE_END:
            {
                count += this->u.end.unknown_count;
            }
            break;
        case BCMOLT_EPON_OAM_INFO_TLV_TYPE_REMOTE:
            {
                count += 15;
            }
            break;
        case BCMOLT_EPON_OAM_INFO_TLV_TYPE_LOCAL:
            {
                count += 15;
            }
            break;
        default:
            {
                count += 1;
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_info_tlv_base_unpack(bcmolt_epon_oam_info_tlv_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_info_tlv_type_unpack(&this->type, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->type)
    {
        case BCMOLT_EPON_OAM_INFO_TLV_TYPE_ORGANIZATION_SPECIFIC:
            {
                if (!bcmolt_epon_oam_organization_specific_info_unpack(&this->u.organization_specific.value, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_INFO_TLV_TYPE_END:
            {
                this->u.end.unknown_count = bcmolt_epon_oam_info_tlv_base_end_count_unknown(buf);
                if ((this->u.end.unknown_count > 0) && (this->u.end.unknown == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"unknown\" of struct \"bcmolt_epon_oam_info_tlv_base_end\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.end.unknown = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.end.unknown_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.end.unknown, this->u.end.unknown_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_INFO_TLV_TYPE_REMOTE:
            {
                if (!bcmolt_epon_oam_local_remote_info_unpack(&this->u.remote.info, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_INFO_TLV_TYPE_LOCAL:
            {
                if (!bcmolt_epon_oam_local_remote_info_unpack(&this->u.local.info, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
                uint8_t length = 0;
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &length))
                {
                    return BCMOS_FALSE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, length, buf->curr);
                if (!bcmolt_epon_oam_buf_skip(buf, length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_info_tlv_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_info_tlv_type type;
    if (!bcmolt_epon_oam_info_tlv_type_unpack(&type, packed))
    {
        return BCMOS_FALSE;
    }

    switch (type)
    {
        case BCMOLT_EPON_OAM_INFO_TLV_TYPE_ORGANIZATION_SPECIFIC:
            {
                if (!bcmolt_epon_oam_organization_specific_info_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_INFO_TLV_TYPE_END:
            {
                uint32_t unknown_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(packed, 1))
                    {
                        break;
                    }

                    unknown_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(unknown_elem_count * sizeof(uint8_t));
            }
            break;
        case BCMOLT_EPON_OAM_INFO_TLV_TYPE_REMOTE:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 15))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_INFO_TLV_TYPE_LOCAL:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 15))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(packed, length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_info_tlv_base_end_count_unknown(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_organization_specific_link_event_base_pack(bcmolt_epon_oam_organization_specific_link_event_base *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t preLenFieldPos;
    uint32_t bytesAfterLenField;
    preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

    /* skip over length field (we'll fill it in later) */
    if (!bcmolt_epon_oam_buf_skip(buf, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_well_known_oui_pack(this->oui, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->oui)
    {
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_TEK:
            {
                if (!bcmolt_epon_oam_tek_alarm_code_pack(this->u.tek.alarm_code, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.tek.raised))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.tek.port))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.tek.link))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.tek.queue))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_tek_alarm_context_pack(this->u.tek.alarm_context, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DPOE:
            {
                if (!bcmolt_epon_oam_dpoe_event_base_pack(&this->u.dpoe.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_CTC:
            {
                if (!bcmolt_epon_oam_ctc_alarm_entry_pack(&this->u.ctc.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_BRCM:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DASAN:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_KT:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_PMC:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_SIEPON_A:
        default:
            {
            }
            break;
    }

    bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
    if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, bytesAfterLenField + 2))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_organization_specific_link_event_base_get_packed_length(bcmolt_epon_oam_organization_specific_link_event_base *this)
{
    uint32_t count = 4;
    switch (this->oui)
    {
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_TEK:
            {
                count += 9;
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DPOE:
            {
                count += bcmolt_epon_oam_dpoe_event_base_get_packed_length(&this->u.dpoe.value);
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_CTC:
            {
                count += bcmolt_epon_oam_ctc_alarm_entry_get_packed_length(&this->u.ctc.value);
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_BRCM:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DASAN:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_KT:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_PMC:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_SIEPON_A:
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_organization_specific_link_event_base_unpack(bcmolt_epon_oam_organization_specific_link_event_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint8_t length = 0;
    bcmolt_epon_oam_buf postLenBuf;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length - 2, buf->curr);
    if (!bcmolt_epon_oam_well_known_oui_unpack(&this->oui, &postLenBuf))
    {
        return BCMOS_FALSE;
    }

    switch (this->oui)
    {
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_TEK:
            {
                if (!bcmolt_epon_oam_tek_alarm_code_unpack(&this->u.tek.alarm_code, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_bool(&postLenBuf, &this->u.tek.raised))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.tek.port))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.tek.link))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.tek.queue))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_tek_alarm_context_unpack(&this->u.tek.alarm_context, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DPOE:
            {
                if (!bcmolt_epon_oam_dpoe_event_base_unpack(&this->u.dpoe.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_CTC:
            {
                if (!bcmolt_epon_oam_ctc_alarm_entry_unpack(&this->u.ctc.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_BRCM:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DASAN:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_KT:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_PMC:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_SIEPON_A:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(buf, length - 2))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_organization_specific_link_event_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_buf postLenBuf;
    uint8_t length;
    bcmolt_epon_oam_well_known_oui oui;
    if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length - 2, packed->curr);
    if (!bcmolt_epon_oam_well_known_oui_unpack(&oui, &postLenBuf))
    {
        return BCMOS_FALSE;
    }

    switch (oui)
    {
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_TEK:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DPOE:
            {
                if (!bcmolt_epon_oam_dpoe_event_base_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_CTC:
            {
                if (!bcmolt_epon_oam_ctc_alarm_entry_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_BRCM:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DASAN:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_KT:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_PMC:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_SIEPON_A:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, length - 2))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_link_event_tlv_base_pack(bcmolt_epon_oam_link_event_tlv_base *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_link_event_type_pack(this->type, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->type)
    {
        case BCMOLT_EPON_OAM_LINK_EVENT_TYPE_END:
            {
                if ((this->u.end.unknown_count > 0) && (this->u.end.unknown == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"unknown\" of struct \"bcmolt_epon_oam_link_event_tlv_base_end\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.end.unknown, this->u.end.unknown_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_LINK_EVENT_TYPE_ORGANIZATION_SPECIFIC:
            {
                if (!bcmolt_epon_oam_organization_specific_link_event_base_pack(&this->u.organization_specific.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_LINK_EVENT_TYPE_ERRORED_FRAME:
        case BCMOLT_EPON_OAM_LINK_EVENT_TYPE_ERRORED_FRAME_PERIOD:
        case BCMOLT_EPON_OAM_LINK_EVENT_TYPE_ERRORED_FRAME_SECONDS_SUMMARY:
        case BCMOLT_EPON_OAM_LINK_EVENT_TYPE_ERRORED_SYMBOL_PERIOD:
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_link_event_tlv_base_get_packed_length(bcmolt_epon_oam_link_event_tlv_base *this)
{
    uint32_t count = 1;
    switch (this->type)
    {
        case BCMOLT_EPON_OAM_LINK_EVENT_TYPE_END:
            {
                count += this->u.end.unknown_count;
            }
            break;
        case BCMOLT_EPON_OAM_LINK_EVENT_TYPE_ORGANIZATION_SPECIFIC:
            {
                count += bcmolt_epon_oam_organization_specific_link_event_base_get_packed_length(&this->u.organization_specific.value);
            }
            break;
        case BCMOLT_EPON_OAM_LINK_EVENT_TYPE_ERRORED_FRAME:
        case BCMOLT_EPON_OAM_LINK_EVENT_TYPE_ERRORED_FRAME_PERIOD:
        case BCMOLT_EPON_OAM_LINK_EVENT_TYPE_ERRORED_FRAME_SECONDS_SUMMARY:
        case BCMOLT_EPON_OAM_LINK_EVENT_TYPE_ERRORED_SYMBOL_PERIOD:
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_link_event_tlv_base_unpack(bcmolt_epon_oam_link_event_tlv_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_link_event_type_unpack(&this->type, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->type)
    {
        case BCMOLT_EPON_OAM_LINK_EVENT_TYPE_END:
            {
                this->u.end.unknown_count = bcmolt_epon_oam_link_event_tlv_base_end_count_unknown(buf);
                if ((this->u.end.unknown_count > 0) && (this->u.end.unknown == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"unknown\" of struct \"bcmolt_epon_oam_link_event_tlv_base_end\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.end.unknown = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.end.unknown_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.end.unknown, this->u.end.unknown_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_LINK_EVENT_TYPE_ORGANIZATION_SPECIFIC:
            {
                if (!bcmolt_epon_oam_organization_specific_link_event_base_unpack(&this->u.organization_specific.value, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_LINK_EVENT_TYPE_ERRORED_FRAME:
        case BCMOLT_EPON_OAM_LINK_EVENT_TYPE_ERRORED_FRAME_PERIOD:
        case BCMOLT_EPON_OAM_LINK_EVENT_TYPE_ERRORED_FRAME_SECONDS_SUMMARY:
        case BCMOLT_EPON_OAM_LINK_EVENT_TYPE_ERRORED_SYMBOL_PERIOD:
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_link_event_tlv_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_link_event_type type;
    if (!bcmolt_epon_oam_link_event_type_unpack(&type, packed))
    {
        return BCMOS_FALSE;
    }

    switch (type)
    {
        case BCMOLT_EPON_OAM_LINK_EVENT_TYPE_END:
            {
                uint32_t unknown_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(packed, 1))
                    {
                        break;
                    }

                    unknown_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(unknown_elem_count * sizeof(uint8_t));
            }
            break;
        case BCMOLT_EPON_OAM_LINK_EVENT_TYPE_ORGANIZATION_SPECIFIC:
            {
                if (!bcmolt_epon_oam_organization_specific_link_event_base_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_LINK_EVENT_TYPE_ERRORED_FRAME:
        case BCMOLT_EPON_OAM_LINK_EVENT_TYPE_ERRORED_FRAME_PERIOD:
        case BCMOLT_EPON_OAM_LINK_EVENT_TYPE_ERRORED_FRAME_SECONDS_SUMMARY:
        case BCMOLT_EPON_OAM_LINK_EVENT_TYPE_ERRORED_SYMBOL_PERIOD:
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_link_event_tlv_base_end_count_unknown(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_var_descriptor_base_pack(bcmolt_epon_oam_var_descriptor_base *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_var_branch_pack(this->branch, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->branch)
    {
        case BCMOLT_EPON_OAM_VAR_BRANCH_END:
            {
                if ((this->u.end.unknown_count > 0) && (this->u.end.unknown == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"unknown\" of struct \"bcmolt_epon_oam_var_descriptor_base_end\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.end.unknown, this->u.end.unknown_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_BRANCH_OBJECT:
            {
                if (!bcmolt_epon_oam_var_leaf_object_pack(this->u.object.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_BRANCH_PACKAGE:
            {
                if (!bcmolt_epon_oam_var_leaf_package_pack(this->u.package.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_BRANCH_NAME_BINDING:
            {
                if (!bcmolt_epon_oam_var_leaf_name_binding_pack(this->u.name_binding.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_BRANCH_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_var_leaf_attribute_pack(this->u.attribute.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_BRANCH_ACTION:
            {
                if (!bcmolt_epon_oam_var_leaf_action_pack(this->u.action.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.def.leaf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_var_descriptor_base_get_packed_length(bcmolt_epon_oam_var_descriptor_base *this)
{
    uint32_t count = 1;
    switch (this->branch)
    {
        case BCMOLT_EPON_OAM_VAR_BRANCH_END:
            {
                count += this->u.end.unknown_count;
            }
            break;
        case BCMOLT_EPON_OAM_VAR_BRANCH_OBJECT:
            {
                count += 2;
            }
            break;
        case BCMOLT_EPON_OAM_VAR_BRANCH_PACKAGE:
            {
                count += 2;
            }
            break;
        case BCMOLT_EPON_OAM_VAR_BRANCH_NAME_BINDING:
            {
                count += 2;
            }
            break;
        case BCMOLT_EPON_OAM_VAR_BRANCH_ATTRIBUTE:
            {
                count += 2;
            }
            break;
        case BCMOLT_EPON_OAM_VAR_BRANCH_ACTION:
            {
                count += 2;
            }
            break;
        default:
            {
                count += 2;
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_var_descriptor_base_unpack(bcmolt_epon_oam_var_descriptor_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_var_branch_unpack(&this->branch, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->branch)
    {
        case BCMOLT_EPON_OAM_VAR_BRANCH_END:
            {
                this->u.end.unknown_count = bcmolt_epon_oam_var_descriptor_base_end_count_unknown(buf);
                if ((this->u.end.unknown_count > 0) && (this->u.end.unknown == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"unknown\" of struct \"bcmolt_epon_oam_var_descriptor_base_end\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.end.unknown = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.end.unknown_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.end.unknown, this->u.end.unknown_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_BRANCH_OBJECT:
            {
                if (!bcmolt_epon_oam_var_leaf_object_unpack(&this->u.object.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_BRANCH_PACKAGE:
            {
                if (!bcmolt_epon_oam_var_leaf_package_unpack(&this->u.package.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_BRANCH_NAME_BINDING:
            {
                if (!bcmolt_epon_oam_var_leaf_name_binding_unpack(&this->u.name_binding.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_BRANCH_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_var_leaf_attribute_unpack(&this->u.attribute.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_BRANCH_ACTION:
            {
                if (!bcmolt_epon_oam_var_leaf_action_unpack(&this->u.action.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.def.leaf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_var_descriptor_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_var_branch branch;
    if (!bcmolt_epon_oam_var_branch_unpack(&branch, packed))
    {
        return BCMOS_FALSE;
    }

    switch (branch)
    {
        case BCMOLT_EPON_OAM_VAR_BRANCH_END:
            {
                uint32_t unknown_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(packed, 1))
                    {
                        break;
                    }

                    unknown_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(unknown_elem_count * sizeof(uint8_t));
            }
            break;
        case BCMOLT_EPON_OAM_VAR_BRANCH_OBJECT:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_BRANCH_PACKAGE:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_BRANCH_NAME_BINDING:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_BRANCH_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_BRANCH_ACTION:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_var_descriptor_base_end_count_unknown(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_var_container_base_pack(bcmolt_epon_oam_var_container_base *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_var_branch_pack(this->branch, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->branch)
    {
        case BCMOLT_EPON_OAM_VAR_BRANCH_END:
            {
                if ((this->u.end.unknown_count > 0) && (this->u.end.unknown == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"unknown\" of struct \"bcmolt_epon_oam_var_container_base_end\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.end.unknown, this->u.end.unknown_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_BRANCH_OBJECT:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (!bcmolt_epon_oam_var_leaf_object_pack(this->u.object.leaf, buf))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.object.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.object.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.object.value_count > 0) && (this->u.object.value == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"value\" of struct \"bcmolt_epon_oam_var_container_base_object\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.object.value, this->u.object.value_count))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_BRANCH_PACKAGE:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (!bcmolt_epon_oam_var_leaf_package_pack(this->u.package.leaf, buf))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.package.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.package.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.package.value_count > 0) && (this->u.package.value == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"value\" of struct \"bcmolt_epon_oam_var_container_base_package\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.package.value, this->u.package.value_count))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_BRANCH_NAME_BINDING:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (!bcmolt_epon_oam_var_leaf_name_binding_pack(this->u.name_binding.leaf, buf))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.name_binding.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.name_binding.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.name_binding.value_count > 0) && (this->u.name_binding.value == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"value\" of struct \"bcmolt_epon_oam_var_container_base_name_binding\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.name_binding.value, this->u.name_binding.value_count))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_BRANCH_ATTRIBUTE:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (!bcmolt_epon_oam_var_leaf_attribute_pack(this->u.attribute.leaf, buf))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.attribute.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.attribute.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.attribute.value_count > 0) && (this->u.attribute.value == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"value\" of struct \"bcmolt_epon_oam_var_container_base_attribute\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.attribute.value, this->u.attribute.value_count))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_BRANCH_ACTION:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (!bcmolt_epon_oam_var_leaf_action_pack(this->u.action.leaf, buf))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.action.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.action.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.action.value_count > 0) && (this->u.action.value == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"value\" of struct \"bcmolt_epon_oam_var_container_base_action\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.action.value, this->u.action.value_count))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.def.leaf))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.def.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.def.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_var_container_base_get_packed_length(bcmolt_epon_oam_var_container_base *this)
{
    uint32_t count = 1;
    switch (this->branch)
    {
        case BCMOLT_EPON_OAM_VAR_BRANCH_END:
            {
                count += this->u.end.unknown_count;
            }
            break;
        case BCMOLT_EPON_OAM_VAR_BRANCH_OBJECT:
            {
                count += 3 + this->u.object.value_count;
            }
            break;
        case BCMOLT_EPON_OAM_VAR_BRANCH_PACKAGE:
            {
                count += 3 + this->u.package.value_count;
            }
            break;
        case BCMOLT_EPON_OAM_VAR_BRANCH_NAME_BINDING:
            {
                count += 3 + this->u.name_binding.value_count;
            }
            break;
        case BCMOLT_EPON_OAM_VAR_BRANCH_ATTRIBUTE:
            {
                count += 3 + this->u.attribute.value_count;
            }
            break;
        case BCMOLT_EPON_OAM_VAR_BRANCH_ACTION:
            {
                count += 3 + this->u.action.value_count;
            }
            break;
        default:
            {
                count += 3;
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_var_container_base_unpack(bcmolt_epon_oam_var_container_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_var_branch_unpack(&this->branch, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->branch)
    {
        case BCMOLT_EPON_OAM_VAR_BRANCH_END:
            {
                this->u.end.unknown_count = bcmolt_epon_oam_var_container_base_end_count_unknown(buf);
                if ((this->u.end.unknown_count > 0) && (this->u.end.unknown == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"unknown\" of struct \"bcmolt_epon_oam_var_container_base_end\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.end.unknown = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.end.unknown_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.end.unknown, this->u.end.unknown_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_BRANCH_OBJECT:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_var_leaf_object_unpack(&this->u.object.leaf, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.object.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.object.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.object.width == 0) ? 0x0080 : this->u.object.width, buf->curr);
                this->u.object.value_count = bcmolt_epon_oam_var_container_base_object_count_value(&postLenBuf);
                if ((this->u.object.value_count > 0) && (this->u.object.value == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"value\" of struct \"bcmolt_epon_oam_var_container_base_object\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.object.value = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.object.value_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.object.value, this->u.object.value_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.object.width == 0) ? 0x0080 : this->u.object.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_BRANCH_PACKAGE:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_var_leaf_package_unpack(&this->u.package.leaf, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.package.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.package.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.package.width == 0) ? 0x0080 : this->u.package.width, buf->curr);
                this->u.package.value_count = bcmolt_epon_oam_var_container_base_package_count_value(&postLenBuf);
                if ((this->u.package.value_count > 0) && (this->u.package.value == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"value\" of struct \"bcmolt_epon_oam_var_container_base_package\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.package.value = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.package.value_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.package.value, this->u.package.value_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.package.width == 0) ? 0x0080 : this->u.package.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_BRANCH_NAME_BINDING:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_var_leaf_name_binding_unpack(&this->u.name_binding.leaf, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.name_binding.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.name_binding.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.name_binding.width == 0) ? 0x0080 : this->u.name_binding.width, buf->curr);
                this->u.name_binding.value_count = bcmolt_epon_oam_var_container_base_name_binding_count_value(&postLenBuf);
                if ((this->u.name_binding.value_count > 0) && (this->u.name_binding.value == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"value\" of struct \"bcmolt_epon_oam_var_container_base_name_binding\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.name_binding.value = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.name_binding.value_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.name_binding.value, this->u.name_binding.value_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.name_binding.width == 0) ? 0x0080 : this->u.name_binding.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_BRANCH_ATTRIBUTE:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_var_leaf_attribute_unpack(&this->u.attribute.leaf, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.attribute.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.attribute.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.attribute.width == 0) ? 0x0080 : this->u.attribute.width, buf->curr);
                this->u.attribute.value_count = bcmolt_epon_oam_var_container_base_attribute_count_value(&postLenBuf);
                if ((this->u.attribute.value_count > 0) && (this->u.attribute.value == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"value\" of struct \"bcmolt_epon_oam_var_container_base_attribute\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.attribute.value = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.attribute.value_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.attribute.value, this->u.attribute.value_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.attribute.width == 0) ? 0x0080 : this->u.attribute.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_BRANCH_ACTION:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_var_leaf_action_unpack(&this->u.action.leaf, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.action.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.action.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.action.width == 0) ? 0x0080 : this->u.action.width, buf->curr);
                this->u.action.value_count = bcmolt_epon_oam_var_container_base_action_count_value(&postLenBuf);
                if ((this->u.action.value_count > 0) && (this->u.action.value == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"value\" of struct \"bcmolt_epon_oam_var_container_base_action\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.action.value = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.action.value_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.action.value, this->u.action.value_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.action.width == 0) ? 0x0080 : this->u.action.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.def.leaf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.def.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.def.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.def.width == 0) ? 0x0080 : this->u.def.width, buf->curr);
                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.def.width == 0) ? 0x0080 : this->u.def.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_var_container_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_var_branch branch;
    if (!bcmolt_epon_oam_var_branch_unpack(&branch, packed))
    {
        return BCMOS_FALSE;
    }

    switch (branch)
    {
        case BCMOLT_EPON_OAM_VAR_BRANCH_END:
            {
                uint32_t unknown_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(packed, 1))
                    {
                        break;
                    }

                    unknown_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(unknown_elem_count * sizeof(uint8_t));
            }
            break;
        case BCMOLT_EPON_OAM_VAR_BRANCH_OBJECT:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                uint32_t value_elem_count = 0;
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                    {
                        break;
                    }

                    value_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(value_elem_count * sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_BRANCH_PACKAGE:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                uint32_t value_elem_count = 0;
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                    {
                        break;
                    }

                    value_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(value_elem_count * sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_BRANCH_NAME_BINDING:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                uint32_t value_elem_count = 0;
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                    {
                        break;
                    }

                    value_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(value_elem_count * sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_BRANCH_ATTRIBUTE:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                uint32_t value_elem_count = 0;
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                    {
                        break;
                    }

                    value_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(value_elem_count * sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_VAR_BRANCH_ACTION:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                uint32_t value_elem_count = 0;
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                    {
                        break;
                    }

                    value_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(value_elem_count * sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_var_container_base_end_count_unknown(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_var_container_base_object_count_value(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_var_container_base_package_count_value(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_var_container_base_name_binding_count_value(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_var_container_base_attribute_count_value(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_var_container_base_action_count_value(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_object_queue_name_pack(bcmolt_epon_oam_tek_object_queue_name *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u16(buf, this->port_number))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->link_number))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->queue_number))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_object_queue_name_unpack(bcmolt_epon_oam_tek_object_queue_name *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->port_number))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->link_number))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->queue_number))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_object_queue_name_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 6);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_object_context_pack(bcmolt_epon_oam_tek_object_context *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t preLenFieldPos;
    uint32_t bytesAfterLenField;
    if (!bcmolt_epon_oam_tek_object_type_pack(this->object_type, buf))
    {
        return BCMOS_FALSE;
    }

    if (this->length >= 0x0080)
    {
        bcmolt_epon_oam_buf_write_u8(buf, this->length);
        return BCMOS_TRUE;
    }

    preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

    /* skip over length field (we'll fill it in later) */
    if (!bcmolt_epon_oam_buf_skip(buf, 1))
    {
        return BCMOS_FALSE;
    }

    switch (this->object_type)
    {
        case BCMOLT_EPON_OAM_TEK_OBJECT_TYPE_LOGICAL_LINK:
            {
                if ((this->u.logical_link.link_number_count > 0) && (this->u.logical_link.link_number == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"link_number\" of struct \"bcmolt_epon_oam_tek_object_context_logical_link\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.logical_link.link_number, this->u.logical_link.link_number_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OBJECT_TYPE_QUEUE_NAME:
            {
                if (!bcmolt_epon_oam_tek_object_queue_name_pack(&this->u.queue_name.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OBJECT_TYPE_PORT:
            {
                if ((this->u.port.port_number_count > 0) && (this->u.port.port_number == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"port_number\" of struct \"bcmolt_epon_oam_tek_object_context_port\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.port.port_number, this->u.port.port_number_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OBJECT_TYPE_ALL_QUEUES:
            {
                if (!bcmolt_epon_oam_tek_object_queue_name_pack(&this->u.all_queues.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OBJECT_TYPE_NETWORK_PON:
            {
                if ((this->u.network_pon.pon_number_count > 0) && (this->u.network_pon.pon_number == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"pon_number\" of struct \"bcmolt_epon_oam_tek_object_context_network_pon\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.network_pon.pon_number, this->u.network_pon.pon_number_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OBJECT_TYPE_USER_PON:
            {
                if ((this->u.user_pon.pon_number_count > 0) && (this->u.user_pon.pon_number == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"pon_number\" of struct \"bcmolt_epon_oam_tek_object_context_user_pon\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.user_pon.pon_number, this->u.user_pon.pon_number_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OBJECT_TYPE_FLOW_DIRECTION:
            {
                if (!bcmolt_epon_oam_flow_direction_pack(this->u.flow_direction.direction, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OBJECT_TYPE_BRIDGE:
            {
                if ((this->u.bridge.bridge_number_count > 0) && (this->u.bridge.bridge_number == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"bridge_number\" of struct \"bcmolt_epon_oam_tek_object_context_bridge\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.bridge.bridge_number, this->u.bridge.bridge_number_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OBJECT_TYPE_BRIDGE_PORT:
            {
                if ((this->u.bridge_port.port_number_count > 0) && (this->u.bridge_port.port_number == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"port_number\" of struct \"bcmolt_epon_oam_tek_object_context_bridge_port\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.bridge_port.port_number, this->u.bridge_port.port_number_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
    if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tek_object_context_get_packed_length(bcmolt_epon_oam_tek_object_context *this)
{
    if (this->length >= 0x0080)
    {
        return this->length;
    }
    else
    {
        uint32_t count = 3;
        switch (this->object_type)
        {
            case BCMOLT_EPON_OAM_TEK_OBJECT_TYPE_LOGICAL_LINK:
                {
                    count += this->u.logical_link.link_number_count;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_OBJECT_TYPE_QUEUE_NAME:
                {
                    count += 6;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_OBJECT_TYPE_PORT:
                {
                    count += this->u.port.port_number_count;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_OBJECT_TYPE_ALL_QUEUES:
                {
                    count += 6;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_OBJECT_TYPE_NETWORK_PON:
                {
                    count += this->u.network_pon.pon_number_count;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_OBJECT_TYPE_USER_PON:
                {
                    count += this->u.user_pon.pon_number_count;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_OBJECT_TYPE_FLOW_DIRECTION:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_OBJECT_TYPE_BRIDGE:
                {
                    count += this->u.bridge.bridge_number_count;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_OBJECT_TYPE_BRIDGE_PORT:
                {
                    count += this->u.bridge_port.port_number_count;
                }
                break;
            default:
                {
                }
                break;
        }

        return count;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_object_context_unpack(bcmolt_epon_oam_tek_object_context *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    bcmolt_epon_oam_buf postLenBuf;
    if (!bcmolt_epon_oam_tek_object_type_unpack(&this->object_type, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->length))
    {
        return BCMOS_FALSE;
    }

    if (this->length >= 0x0080)
    {
        return BCMOS_TRUE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, (this->length == 0) ? 0x0080 : this->length, buf->curr);
    switch (this->object_type)
    {
        case BCMOLT_EPON_OAM_TEK_OBJECT_TYPE_LOGICAL_LINK:
            {
                this->u.logical_link.link_number_count = bcmolt_epon_oam_tek_object_context_logical_link_count_link_number(&postLenBuf);
                if ((this->u.logical_link.link_number_count > 0) && (this->u.logical_link.link_number == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"link_number\" of struct \"bcmolt_epon_oam_tek_object_context_logical_link\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.logical_link.link_number = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.logical_link.link_number_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.logical_link.link_number, this->u.logical_link.link_number_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OBJECT_TYPE_QUEUE_NAME:
            {
                if (!bcmolt_epon_oam_tek_object_queue_name_unpack(&this->u.queue_name.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OBJECT_TYPE_PORT:
            {
                this->u.port.port_number_count = bcmolt_epon_oam_tek_object_context_port_count_port_number(&postLenBuf);
                if ((this->u.port.port_number_count > 0) && (this->u.port.port_number == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"port_number\" of struct \"bcmolt_epon_oam_tek_object_context_port\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.port.port_number = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.port.port_number_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.port.port_number, this->u.port.port_number_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OBJECT_TYPE_ALL_QUEUES:
            {
                if (!bcmolt_epon_oam_tek_object_queue_name_unpack(&this->u.all_queues.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OBJECT_TYPE_NETWORK_PON:
            {
                this->u.network_pon.pon_number_count = bcmolt_epon_oam_tek_object_context_network_pon_count_pon_number(&postLenBuf);
                if ((this->u.network_pon.pon_number_count > 0) && (this->u.network_pon.pon_number == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"pon_number\" of struct \"bcmolt_epon_oam_tek_object_context_network_pon\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.network_pon.pon_number = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.network_pon.pon_number_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.network_pon.pon_number, this->u.network_pon.pon_number_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OBJECT_TYPE_USER_PON:
            {
                this->u.user_pon.pon_number_count = bcmolt_epon_oam_tek_object_context_user_pon_count_pon_number(&postLenBuf);
                if ((this->u.user_pon.pon_number_count > 0) && (this->u.user_pon.pon_number == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"pon_number\" of struct \"bcmolt_epon_oam_tek_object_context_user_pon\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.user_pon.pon_number = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.user_pon.pon_number_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.user_pon.pon_number, this->u.user_pon.pon_number_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OBJECT_TYPE_FLOW_DIRECTION:
            {
                if (!bcmolt_epon_oam_flow_direction_unpack(&this->u.flow_direction.direction, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OBJECT_TYPE_BRIDGE:
            {
                this->u.bridge.bridge_number_count = bcmolt_epon_oam_tek_object_context_bridge_count_bridge_number(&postLenBuf);
                if ((this->u.bridge.bridge_number_count > 0) && (this->u.bridge.bridge_number == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"bridge_number\" of struct \"bcmolt_epon_oam_tek_object_context_bridge\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.bridge.bridge_number = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.bridge.bridge_number_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.bridge.bridge_number, this->u.bridge.bridge_number_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OBJECT_TYPE_BRIDGE_PORT:
            {
                this->u.bridge_port.port_number_count = bcmolt_epon_oam_tek_object_context_bridge_port_count_port_number(&postLenBuf);
                if ((this->u.bridge_port.port_number_count > 0) && (this->u.bridge_port.port_number == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"port_number\" of struct \"bcmolt_epon_oam_tek_object_context_bridge_port\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.bridge_port.port_number = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.bridge_port.port_number_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.bridge_port.port_number, this->u.bridge_port.port_number_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(buf, (this->length == 0) ? 0x0080 : this->length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_object_context_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_tek_object_type object_type;
    bcmolt_epon_oam_buf postLenBuf;
    uint8_t length;
    if (!bcmolt_epon_oam_tek_object_type_unpack(&object_type, packed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
    {
        return BCMOS_FALSE;
    }

    if (length >= 0x0080)
    {
        return BCMOS_TRUE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
    switch (object_type)
    {
        case BCMOLT_EPON_OAM_TEK_OBJECT_TYPE_LOGICAL_LINK:
            {
                uint32_t link_number_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                    {
                        break;
                    }

                    link_number_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(link_number_elem_count * sizeof(uint8_t));
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OBJECT_TYPE_QUEUE_NAME:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 6))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OBJECT_TYPE_PORT:
            {
                uint32_t port_number_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                    {
                        break;
                    }

                    port_number_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(port_number_elem_count * sizeof(uint8_t));
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OBJECT_TYPE_ALL_QUEUES:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 6))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OBJECT_TYPE_NETWORK_PON:
            {
                uint32_t pon_number_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                    {
                        break;
                    }

                    pon_number_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(pon_number_elem_count * sizeof(uint8_t));
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OBJECT_TYPE_USER_PON:
            {
                uint32_t pon_number_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                    {
                        break;
                    }

                    pon_number_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(pon_number_elem_count * sizeof(uint8_t));
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OBJECT_TYPE_FLOW_DIRECTION:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OBJECT_TYPE_BRIDGE:
            {
                uint32_t bridge_number_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                    {
                        break;
                    }

                    bridge_number_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(bridge_number_elem_count * sizeof(uint8_t));
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OBJECT_TYPE_BRIDGE_PORT:
            {
                uint32_t port_number_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                    {
                        break;
                    }

                    port_number_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(port_number_elem_count * sizeof(uint8_t));
            }
            break;
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tek_object_context_logical_link_count_link_number(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tek_object_context_port_count_port_number(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tek_object_context_network_pon_count_pon_number(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tek_object_context_user_pon_count_pon_number(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tek_object_context_bridge_count_bridge_number(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tek_object_context_bridge_port_count_port_number(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_var_descriptor_pack(bcmolt_epon_oam_tek_var_descriptor *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_tek_branch_pack(this->branch, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->branch)
    {
        case BCMOLT_EPON_OAM_TEK_BRANCH_END:
            {
                if ((this->u.end.unknown_count > 0) && (this->u.end.unknown == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"unknown\" of struct \"bcmolt_epon_oam_tek_var_descriptor_end\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.end.unknown, this->u.end.unknown_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_NAME_BINDING:
            {
                if (!bcmolt_epon_oam_tek_object_context_pack(&this->u.name_binding.object_context, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_ATTRIBUTE:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (!bcmolt_epon_oam_tek_leaf_attribute_pack(this->u.attribute.leaf, buf))
                {
                    return BCMOS_FALSE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (((uint64_t) this->u.attribute.leaf == 0x7FE5))
                {
                    if (!bcmolt_epon_oam_tek_alarm_code_pack(this->u.attribute.alarm_code, buf))
                    {
                        return BCMOS_FALSE;
                    }
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_ACTION:
            {
                if (!bcmolt_epon_oam_tek_leaf_action_pack(this->u.action.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_OBJECT:
        case BCMOLT_EPON_OAM_TEK_BRANCH_PACKAGE:
        default:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.def.leaf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tek_var_descriptor_get_packed_length(bcmolt_epon_oam_tek_var_descriptor *this)
{
    uint32_t count = 1;
    switch (this->branch)
    {
        case BCMOLT_EPON_OAM_TEK_BRANCH_END:
            {
                count += this->u.end.unknown_count;
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_NAME_BINDING:
            {
                count += bcmolt_epon_oam_tek_object_context_get_packed_length(&this->u.name_binding.object_context);
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_ATTRIBUTE:
            {
                count += 4;
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_ACTION:
            {
                count += 2;
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_OBJECT:
        case BCMOLT_EPON_OAM_TEK_BRANCH_PACKAGE:
        default:
            {
                count += 2;
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_var_descriptor_unpack(bcmolt_epon_oam_tek_var_descriptor *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_tek_branch_unpack(&this->branch, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->branch)
    {
        case BCMOLT_EPON_OAM_TEK_BRANCH_END:
            {
                this->u.end.unknown_count = bcmolt_epon_oam_tek_var_descriptor_end_count_unknown(buf);
                if ((this->u.end.unknown_count > 0) && (this->u.end.unknown == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"unknown\" of struct \"bcmolt_epon_oam_tek_var_descriptor_end\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.end.unknown = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.end.unknown_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.end.unknown, this->u.end.unknown_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_NAME_BINDING:
            {
                if (!bcmolt_epon_oam_tek_object_context_unpack(&this->u.name_binding.object_context, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_ATTRIBUTE:
            {
                uint8_t width = 0;
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_tek_leaf_attribute_unpack(&this->u.attribute.leaf, buf))
                {
                    return BCMOS_FALSE;
                }

                if (((uint64_t) this->u.attribute.leaf == 0x7FE5))
                {
                    if (!bcmolt_epon_oam_buf_read_u8(buf, &width))
                    {
                        return BCMOS_FALSE;
                    }
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, width, buf->curr);
                if (((uint64_t) this->u.attribute.leaf == 0x7FE5))
                {
                    if (!bcmolt_epon_oam_tek_alarm_code_unpack(&this->u.attribute.alarm_code, &postLenBuf))
                    {
                        return BCMOS_FALSE;
                    }
                }

                if (!bcmolt_epon_oam_buf_skip(buf, width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_ACTION:
            {
                if (!bcmolt_epon_oam_tek_leaf_action_unpack(&this->u.action.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_OBJECT:
        case BCMOLT_EPON_OAM_TEK_BRANCH_PACKAGE:
        default:
            {
                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.def.leaf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_var_descriptor_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_tek_branch branch;
    if (!bcmolt_epon_oam_tek_branch_unpack(&branch, packed))
    {
        return BCMOS_FALSE;
    }

    switch (branch)
    {
        case BCMOLT_EPON_OAM_TEK_BRANCH_END:
            {
                uint32_t unknown_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(packed, 1))
                    {
                        break;
                    }

                    unknown_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(unknown_elem_count * sizeof(uint8_t));
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_NAME_BINDING:
            {
                if (!bcmolt_epon_oam_tek_object_context_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_ATTRIBUTE:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_ACTION:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_OBJECT:
        case BCMOLT_EPON_OAM_TEK_BRANCH_PACKAGE:
        default:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tek_var_descriptor_end_count_unknown(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_lue_field_select_entry_pack(bcmolt_epon_oam_lue_field_select_entry *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u8(buf, this->layer_select))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->dword_offset))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->field_length))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->bit_offset))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_lue_field_select_entry_unpack(bcmolt_epon_oam_lue_field_select_entry *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->layer_select))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->dword_offset))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->field_length))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->bit_offset))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_lue_field_select_entry_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 4);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_onu_rule_clause_pack(bcmolt_epon_oam_tek_onu_rule_clause *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_tek_onu_field_select_pack(this->field_select, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->lookup_value))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_tek_onu_rule_operator_pack(this->op, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_onu_rule_clause_unpack(bcmolt_epon_oam_tek_onu_rule_clause *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_tek_onu_field_select_unpack(&this->field_select, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->lookup_value))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_tek_onu_rule_operator_unpack(&this->op, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_onu_rule_clause_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 10);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_onu_rule_pack(bcmolt_epon_oam_tek_onu_rule *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t i0;
    if (!bcmolt_epon_oam_buf_write_u8(buf, this->direction))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_tek_onu_rule_flags_pack(this->flags, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->port_link))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->queue))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->vid_cos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->reserved))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->precedence))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_tek_onu_rule_action_pack(this->action, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->clauses_count))
    {
        return BCMOS_FALSE;
    }

    if ((this->clauses_count > 0) && (this->clauses == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"clauses\" of struct \"bcmolt_epon_oam_tek_onu_rule\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->clauses_count; i0++)
    {
        if (!bcmolt_epon_oam_tek_onu_rule_clause_pack(&this->clauses[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tek_onu_rule_get_packed_length(bcmolt_epon_oam_tek_onu_rule *this)
{
    return 10 + (10 * this->clauses_count);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_onu_rule_unpack(bcmolt_epon_oam_tek_onu_rule *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint8_t i0;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->direction))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_tek_onu_rule_flags_unpack(&this->flags, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->port_link))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->queue))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->vid_cos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->reserved))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->precedence))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_tek_onu_rule_action_unpack(&this->action, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->clauses_count))
    {
        return BCMOS_FALSE;
    }

    if ((this->clauses_count > 0) && (this->clauses == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"clauses\" of struct \"bcmolt_epon_oam_tek_onu_rule\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->clauses = (bcmolt_epon_oam_tek_onu_rule_clause *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->clauses_count * sizeof(bcmolt_epon_oam_tek_onu_rule_clause));
        }
    }

    for (i0 = 0; i0 < this->clauses_count; i0++)
    {
        if (!bcmolt_epon_oam_tek_onu_rule_clause_unpack(&this->clauses[i0], buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_onu_rule_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    uint8_t clauses_count;
    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 2))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(packed, &clauses_count))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_tek_onu_rule_clause) * clauses_count);
    if (!bcmolt_epon_oam_buf_skip(packed, clauses_count * 10))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_onu_igmp_vlan_pack(bcmolt_epon_oam_tek_onu_igmp_vlan *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_vlan_tag(buf, this->epon_vlan))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_vlan_tag(buf, this->user_vlan))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->max_allowed_groups))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_onu_igmp_vlan_unpack(bcmolt_epon_oam_tek_onu_igmp_vlan *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_vlan_tag(buf, &this->epon_vlan))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_vlan_tag(buf, &this->user_vlan))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->max_allowed_groups))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_onu_igmp_vlan_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 5);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_vlan_destination_mapping_pack(bcmolt_epon_oam_tek_vlan_destination_mapping *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_vlan_tag(buf, this->vlan_tag))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->link_index))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->queue_index))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_vlan_destination_mapping_unpack(bcmolt_epon_oam_tek_vlan_destination_mapping *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_vlan_tag(buf, &this->vlan_tag))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->link_index))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->queue_index))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_vlan_destination_mapping_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 4);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_firmware_timestamp_pack(bcmolt_epon_oam_tek_firmware_timestamp *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u16(buf, this->year))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->month))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->day))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->hour))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->min))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->sec))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_firmware_timestamp_unpack(bcmolt_epon_oam_tek_firmware_timestamp *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->year))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->month))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->day))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->hour))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->min))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->sec))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_firmware_timestamp_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 7);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_rule_entry_pack(bcmolt_epon_oam_rule_entry *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u16(buf, this->learning_domain))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->stat))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->right_mask))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_binary_field_select_type_pack(this->binselect, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->binselect)
    {
        case BCMOLT_EPON_OAM_BINARY_FIELD_SELECT_TYPE_SA:
            {
                if (!bcmolt_epon_oam_binary_entry_mac_pack(&this->u.sa.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BINARY_FIELD_SELECT_TYPE_DA:
            {
                if (!bcmolt_epon_oam_binary_entry_mac_pack(&this->u.da.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BINARY_FIELD_SELECT_TYPE_SSM_PLUS_IPDA:
            {
                if (!bcmolt_epon_oam_binary_entry_ssm_ip_pack(&this->u.ssm_plus_ipda.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BINARY_FIELD_SELECT_TYPE_PROG_FIELD:
            {
                if (!bcmolt_epon_oam_binary_entry_programmable_pack(&this->u.prog_field.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BINARY_FIELD_SELECT_TYPE_CVLAN_VID:
            {
                if (!bcmolt_epon_oam_binary_entry_cvid_pack(&this->u.cvlan_vid.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BINARY_FIELD_SELECT_TYPE_SVLAN_VID_CVLAN_VID:
            {
                if (!bcmolt_epon_oam_binary_entry_svlan_plus_cvlan_pack(&this->u.svlan_vid_cvlan_vid.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_rule_entry_get_packed_length(bcmolt_epon_oam_rule_entry *this)
{
    uint32_t count = 5;
    switch (this->binselect)
    {
        case BCMOLT_EPON_OAM_BINARY_FIELD_SELECT_TYPE_SA:
            {
                count += 9;
            }
            break;
        case BCMOLT_EPON_OAM_BINARY_FIELD_SELECT_TYPE_DA:
            {
                count += 9;
            }
            break;
        case BCMOLT_EPON_OAM_BINARY_FIELD_SELECT_TYPE_SSM_PLUS_IPDA:
            {
                count += 8;
            }
            break;
        case BCMOLT_EPON_OAM_BINARY_FIELD_SELECT_TYPE_PROG_FIELD:
            {
                count += 8;
            }
            break;
        case BCMOLT_EPON_OAM_BINARY_FIELD_SELECT_TYPE_CVLAN_VID:
            {
                count += 2;
            }
            break;
        case BCMOLT_EPON_OAM_BINARY_FIELD_SELECT_TYPE_SVLAN_VID_CVLAN_VID:
            {
                count += 4;
            }
            break;
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_rule_entry_unpack(bcmolt_epon_oam_rule_entry *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->learning_domain))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->stat))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->right_mask))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_binary_field_select_type_unpack(&this->binselect, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->binselect)
    {
        case BCMOLT_EPON_OAM_BINARY_FIELD_SELECT_TYPE_SA:
            {
                if (!bcmolt_epon_oam_binary_entry_mac_unpack(&this->u.sa.value, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BINARY_FIELD_SELECT_TYPE_DA:
            {
                if (!bcmolt_epon_oam_binary_entry_mac_unpack(&this->u.da.value, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BINARY_FIELD_SELECT_TYPE_SSM_PLUS_IPDA:
            {
                if (!bcmolt_epon_oam_binary_entry_ssm_ip_unpack(&this->u.ssm_plus_ipda.value, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BINARY_FIELD_SELECT_TYPE_PROG_FIELD:
            {
                if (!bcmolt_epon_oam_binary_entry_programmable_unpack(&this->u.prog_field.value, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BINARY_FIELD_SELECT_TYPE_CVLAN_VID:
            {
                if (!bcmolt_epon_oam_binary_entry_cvid_unpack(&this->u.cvlan_vid.value, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BINARY_FIELD_SELECT_TYPE_SVLAN_VID_CVLAN_VID:
            {
                if (!bcmolt_epon_oam_binary_entry_svlan_plus_cvlan_unpack(&this->u.svlan_vid_cvlan_vid.value, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_rule_entry_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_binary_field_select_type binselect;
    if (!bcmolt_epon_oam_buf_skip(packed, 2))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_binary_field_select_type_unpack(&binselect, packed))
    {
        return BCMOS_FALSE;
    }

    switch (binselect)
    {
        case BCMOLT_EPON_OAM_BINARY_FIELD_SELECT_TYPE_SA:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 9))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BINARY_FIELD_SELECT_TYPE_DA:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 9))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BINARY_FIELD_SELECT_TYPE_SSM_PLUS_IPDA:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BINARY_FIELD_SELECT_TYPE_PROG_FIELD:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BINARY_FIELD_SELECT_TYPE_CVLAN_VID:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_BINARY_FIELD_SELECT_TYPE_SVLAN_VID_CVLAN_VID:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_attribute_value_rule_pack(bcmolt_epon_oam_tek_attribute_value_rule *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_rule_type_pack(this->leaf, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->leaf)
    {
        case BCMOLT_EPON_OAM_RULE_TYPE_TERMINATOR:
            {
            }
            break;
        case BCMOLT_EPON_OAM_RULE_TYPE_HEADER:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.header.priority))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_RULE_TYPE_CLAUSE:
            {
                if (!bcmolt_epon_oam_rule_field_select_pack(this->u.clause.field_select, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.clause.field_instance))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.clause.msb_mask))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.clause.lsb_mask))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_rule_operator_pack(this->u.clause.operator, buf))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.clause.match_value_count > 0) && (this->u.clause.match_value == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"match_value\" of struct \"bcmolt_epon_oam_tek_attribute_value_rule_clause\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.clause.match_value, this->u.clause.match_value_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_RULE_TYPE_RESULT:
            {
                if (!bcmolt_epon_oam_rule_action_pack(this->u.result.result, buf))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.result.parameter_count > 0) && (this->u.result.parameter == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"parameter\" of struct \"bcmolt_epon_oam_tek_attribute_value_rule_result\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.result.parameter, this->u.result.parameter_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_RULE_TYPE_ENTRY:
            {
                if (!bcmolt_epon_oam_rule_entry_pack(&this->u.entry.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tek_attribute_value_rule_get_packed_length(bcmolt_epon_oam_tek_attribute_value_rule *this)
{
    uint32_t count = 1;
    switch (this->leaf)
    {
        case BCMOLT_EPON_OAM_RULE_TYPE_TERMINATOR:
            {
            }
            break;
        case BCMOLT_EPON_OAM_RULE_TYPE_HEADER:
            {
                count += 1;
            }
            break;
        case BCMOLT_EPON_OAM_RULE_TYPE_CLAUSE:
            {
                count += 5 + this->u.clause.match_value_count;
            }
            break;
        case BCMOLT_EPON_OAM_RULE_TYPE_RESULT:
            {
                count += 1 + this->u.result.parameter_count;
            }
            break;
        case BCMOLT_EPON_OAM_RULE_TYPE_ENTRY:
            {
                count += bcmolt_epon_oam_rule_entry_get_packed_length(&this->u.entry.value);
            }
            break;
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_attribute_value_rule_unpack(bcmolt_epon_oam_tek_attribute_value_rule *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_rule_type_unpack(&this->leaf, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->leaf)
    {
        case BCMOLT_EPON_OAM_RULE_TYPE_TERMINATOR:
            {
            }
            break;
        case BCMOLT_EPON_OAM_RULE_TYPE_HEADER:
            {
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.header.priority))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_RULE_TYPE_CLAUSE:
            {
                if (!bcmolt_epon_oam_rule_field_select_unpack(&this->u.clause.field_select, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.clause.field_instance))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.clause.msb_mask))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.clause.lsb_mask))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_rule_operator_unpack(&this->u.clause.operator, buf))
                {
                    return BCMOS_FALSE;
                }

                this->u.clause.match_value_count = bcmolt_epon_oam_tek_attribute_value_rule_clause_count_match_value(buf);
                if ((this->u.clause.match_value_count > 0) && (this->u.clause.match_value == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"match_value\" of struct \"bcmolt_epon_oam_tek_attribute_value_rule_clause\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.clause.match_value = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.clause.match_value_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.clause.match_value, this->u.clause.match_value_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_RULE_TYPE_RESULT:
            {
                if (!bcmolt_epon_oam_rule_action_unpack(&this->u.result.result, buf))
                {
                    return BCMOS_FALSE;
                }

                this->u.result.parameter_count = bcmolt_epon_oam_tek_attribute_value_rule_result_count_parameter(buf);
                if ((this->u.result.parameter_count > 0) && (this->u.result.parameter == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"parameter\" of struct \"bcmolt_epon_oam_tek_attribute_value_rule_result\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.result.parameter = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.result.parameter_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.result.parameter, this->u.result.parameter_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_RULE_TYPE_ENTRY:
            {
                if (!bcmolt_epon_oam_rule_entry_unpack(&this->u.entry.value, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_attribute_value_rule_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_rule_type leaf;
    if (!bcmolt_epon_oam_rule_type_unpack(&leaf, packed))
    {
        return BCMOS_FALSE;
    }

    switch (leaf)
    {
        case BCMOLT_EPON_OAM_RULE_TYPE_TERMINATOR:
            {
            }
            break;
        case BCMOLT_EPON_OAM_RULE_TYPE_HEADER:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_RULE_TYPE_CLAUSE:
            {
                uint32_t match_value_elem_count = 0;
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(packed, 1))
                    {
                        break;
                    }

                    match_value_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(match_value_elem_count * sizeof(uint8_t));
            }
            break;
        case BCMOLT_EPON_OAM_RULE_TYPE_RESULT:
            {
                uint32_t parameter_elem_count = 0;
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(packed, 1))
                    {
                        break;
                    }

                    parameter_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(parameter_elem_count * sizeof(uint8_t));
            }
            break;
        case BCMOLT_EPON_OAM_RULE_TYPE_ENTRY:
            {
                if (!bcmolt_epon_oam_rule_entry_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tek_attribute_value_rule_clause_count_match_value(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tek_attribute_value_rule_result_count_parameter(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_uni_shaper_pack(bcmolt_epon_oam_uni_shaper *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u32(buf, this->queue_bitmap))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->shape_rate))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->burst_size))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_uni_shaper_unpack(bcmolt_epon_oam_uni_shaper *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->queue_bitmap))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->shape_rate))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->burst_size))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_uni_shaper_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 10);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_extended_version_number_pack(bcmolt_epon_oam_extended_version_number *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u8(buf, this->major))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->minor))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->patch))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_extended_version_number_unpack(bcmolt_epon_oam_extended_version_number *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->major))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->minor))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->patch))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_extended_version_number_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 4);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_extended_load_label_pack(bcmolt_epon_oam_extended_load_label *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_tek_maturity_pack(this->maturity, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_extended_version_number_pack(&this->version, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_extended_load_label_unpack(bcmolt_epon_oam_extended_load_label *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_tek_maturity_unpack(&this->maturity, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_extended_version_number_unpack(&this->version, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_extended_load_label_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 5);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_file_info_firmware_pack(bcmolt_epon_oam_file_info_firmware *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u16(buf, this->legacy_version))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_extended_load_label_pack(&this->new_version, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->stream))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->revision))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->crc))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_tek_firmware_timestamp_pack(&this->timestamp, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_file_info_firmware_unpack(bcmolt_epon_oam_file_info_firmware *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->legacy_version))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_extended_load_label_unpack(&this->new_version, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->stream))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->revision))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->crc))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_tek_firmware_timestamp_unpack(&this->timestamp, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_file_info_firmware_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 26);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_file_info_base_pack(bcmolt_epon_oam_file_info_base *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_file_type_pack(this->file_type, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->file_type)
    {
        case BCMOLT_EPON_OAM_FILE_TYPE_BOOT:
            {
                if (!bcmolt_epon_oam_file_info_firmware_pack(&this->u.boot.info, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_FILE_TYPE_APP_MAIN:
            {
                if (!bcmolt_epon_oam_file_info_firmware_pack(&this->u.app_main.info, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_FILE_TYPE_APP_BACKUP:
            {
                if (!bcmolt_epon_oam_file_info_firmware_pack(&this->u.app_backup.info, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_file_info_base_get_packed_length(bcmolt_epon_oam_file_info_base *this)
{
    uint32_t count = 1;
    switch (this->file_type)
    {
        case BCMOLT_EPON_OAM_FILE_TYPE_BOOT:
            {
                count += 26;
            }
            break;
        case BCMOLT_EPON_OAM_FILE_TYPE_APP_MAIN:
            {
                count += 26;
            }
            break;
        case BCMOLT_EPON_OAM_FILE_TYPE_APP_BACKUP:
            {
                count += 26;
            }
            break;
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_file_info_base_unpack(bcmolt_epon_oam_file_info_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_file_type_unpack(&this->file_type, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->file_type)
    {
        case BCMOLT_EPON_OAM_FILE_TYPE_BOOT:
            {
                if (!bcmolt_epon_oam_file_info_firmware_unpack(&this->u.boot.info, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_FILE_TYPE_APP_MAIN:
            {
                if (!bcmolt_epon_oam_file_info_firmware_unpack(&this->u.app_main.info, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_FILE_TYPE_APP_BACKUP:
            {
                if (!bcmolt_epon_oam_file_info_firmware_unpack(&this->u.app_backup.info, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_file_info_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_file_type file_type;
    if (!bcmolt_epon_oam_file_type_unpack(&file_type, packed))
    {
        return BCMOS_FALSE;
    }

    switch (file_type)
    {
        case BCMOLT_EPON_OAM_FILE_TYPE_BOOT:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 26))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_FILE_TYPE_APP_MAIN:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 26))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_FILE_TYPE_APP_BACKUP:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 26))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_epoc_bit_load_pack(bcmolt_epon_oam_oam_epoc_bit_load *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u8(buf, this->idx))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->value))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_epoc_bit_load_unpack(bcmolt_epon_oam_oam_epoc_bit_load *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->idx))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->value))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_epoc_bit_load_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 2);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_epoc_bit_loading_pack(bcmolt_epon_oam_oam_epoc_bit_loading *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t i0;
    for (i0 = 0; i0 < 32; i0++)
    {
        if (!bcmolt_epon_oam_oam_epoc_bit_load_pack(&this->load[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_epoc_bit_loading_unpack(bcmolt_epon_oam_oam_epoc_bit_loading *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint32_t i0;
    for (i0 = 0; i0 < 32; i0++)
    {
        if (!bcmolt_epon_oam_oam_epoc_bit_load_unpack(&this->load[i0], buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_epoc_bit_loading_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 64);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_epoc_stat_pack(bcmolt_epon_oam_oam_epoc_stat *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u16(buf, this->idx))
    {
        return BCMOS_FALSE;
    }

    if ((this->value_count > 0) && (this->value == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"value\" of struct \"bcmolt_epon_oam_oam_epoc_stat\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write(buf, this->value, this->value_count))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_oam_epoc_stat_get_packed_length(bcmolt_epon_oam_oam_epoc_stat *this)
{
    return 2 + this->value_count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_epoc_stat_unpack(bcmolt_epon_oam_oam_epoc_stat *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->idx))
    {
        return BCMOS_FALSE;
    }

    this->value_count = bcmolt_epon_oam_oam_epoc_stat_count_value(buf);
    if ((this->value_count > 0) && (this->value == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"value\" of struct \"bcmolt_epon_oam_oam_epoc_stat\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->value = (uint8_t *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->value_count * sizeof(uint8_t));
        }
    }

    if (!bcmolt_epon_oam_buf_read(buf, this->value, this->value_count))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_epoc_stat_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    uint32_t value_elem_count = 0;
    if (!bcmolt_epon_oam_buf_skip(packed, 2))
    {
        return BCMOS_FALSE;
    }

    while (BCMOS_TRUE)
    {
        if (!bcmolt_epon_oam_buf_skip(packed, 1))
        {
            break;
        }

        value_elem_count += 1;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(value_elem_count * sizeof(uint8_t));
    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_oam_epoc_stat_count_value(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_queue_config_v2priority_pack(bcmolt_epon_oam_tek_queue_config_v2priority *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t i0;
    if (!bcmolt_epon_oam_buf_write_u8(buf, this->level))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->weight))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->queue_count))
    {
        return BCMOS_FALSE;
    }

    if ((this->queue_count > 0) && (this->queue_sizes == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"queue_sizes\" of struct \"bcmolt_epon_oam_tek_queue_config_v2priority\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->queue_count; i0++)
    {
        if (!bcmolt_epon_oam_buf_write_u16(buf, this->queue_sizes[i0]))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tek_queue_config_v2priority_get_packed_length(bcmolt_epon_oam_tek_queue_config_v2priority *this)
{
    return 3 + (2 * this->queue_count);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_queue_config_v2priority_unpack(bcmolt_epon_oam_tek_queue_config_v2priority *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint8_t i0;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->level))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->weight))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->queue_count))
    {
        return BCMOS_FALSE;
    }

    if ((this->queue_count > 0) && (this->queue_sizes == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"queue_sizes\" of struct \"bcmolt_epon_oam_tek_queue_config_v2priority\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->queue_sizes = (uint16_t *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->queue_count * sizeof(uint16_t));
        }
    }

    for (i0 = 0; i0 < this->queue_count; i0++)
    {
        if (!bcmolt_epon_oam_buf_read_u16(buf, &this->queue_sizes[i0]))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_queue_config_v2priority_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    uint8_t queue_count;
    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(packed, &queue_count))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint16_t) * queue_count);
    if (!bcmolt_epon_oam_buf_skip(packed, queue_count * 2))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_queue_config_v2base_pack(bcmolt_epon_oam_tek_queue_config_v2base *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_tek_queue_config_v2subtype_pack(this->subtype, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->subtype)
    {
        case BCMOLT_EPON_OAM_TEK_QUEUE_CONFIG_V2SUBTYPE_HEADER:
            {
                if (!bcmolt_epon_oam_tek_report_mode_pack(this->u.header.report_config, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_QUEUE_CONFIG_V2SUBTYPE_LINK:
            {
                uint8_t i0;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.link.priority_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.link.priority_count > 0) && (this->u.link.priorities == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"priorities\" of struct \"bcmolt_epon_oam_tek_queue_config_v2base_link\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i0 = 0; i0 < this->u.link.priority_count; i0++)
                {
                    if (!bcmolt_epon_oam_tek_queue_config_v2priority_pack(&this->u.link.priorities[i0], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_QUEUE_CONFIG_V2SUBTYPE_PORT:
            {
                uint8_t i1;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.port.priority_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.port.priority_count > 0) && (this->u.port.priorities == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"priorities\" of struct \"bcmolt_epon_oam_tek_queue_config_v2base_port\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i1 = 0; i1 < this->u.port.priority_count; i1++)
                {
                    if (!bcmolt_epon_oam_tek_queue_config_v2priority_pack(&this->u.port.priorities[i1], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_QUEUE_CONFIG_V2SUBTYPE_TERMINATOR:
            {
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tek_queue_config_v2base_get_packed_length(bcmolt_epon_oam_tek_queue_config_v2base *this)
{
    uint32_t count = 1;
    switch (this->subtype)
    {
        case BCMOLT_EPON_OAM_TEK_QUEUE_CONFIG_V2SUBTYPE_HEADER:
            {
                count += 1;
            }
            break;
        case BCMOLT_EPON_OAM_TEK_QUEUE_CONFIG_V2SUBTYPE_LINK:
            {
                uint32_t i0;
                count += 1;
                if ((this->u.link.priority_count > 0) && (this->u.link.priorities == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"priority_count\" of struct \"bcmolt_epon_oam_tek_queue_config_v2base\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return 0;
                }

                for (i0 = 0; i0 < this->u.link.priority_count; i0++)
                {
                    count += bcmolt_epon_oam_tek_queue_config_v2priority_get_packed_length(&this->u.link.priorities[i0]);
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_QUEUE_CONFIG_V2SUBTYPE_PORT:
            {
                uint32_t i1;
                count += 1;
                if ((this->u.port.priority_count > 0) && (this->u.port.priorities == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"priority_count\" of struct \"bcmolt_epon_oam_tek_queue_config_v2base\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return 0;
                }

                for (i1 = 0; i1 < this->u.port.priority_count; i1++)
                {
                    count += bcmolt_epon_oam_tek_queue_config_v2priority_get_packed_length(&this->u.port.priorities[i1]);
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_QUEUE_CONFIG_V2SUBTYPE_TERMINATOR:
            {
            }
            break;
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_queue_config_v2base_unpack(bcmolt_epon_oam_tek_queue_config_v2base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_tek_queue_config_v2subtype_unpack(&this->subtype, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->subtype)
    {
        case BCMOLT_EPON_OAM_TEK_QUEUE_CONFIG_V2SUBTYPE_HEADER:
            {
                if (!bcmolt_epon_oam_tek_report_mode_unpack(&this->u.header.report_config, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_QUEUE_CONFIG_V2SUBTYPE_LINK:
            {
                uint8_t i0;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.link.priority_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.link.priority_count > 0) && (this->u.link.priorities == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"priorities\" of struct \"bcmolt_epon_oam_tek_queue_config_v2base_link\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.link.priorities = (bcmolt_epon_oam_tek_queue_config_v2priority *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.link.priority_count * sizeof(bcmolt_epon_oam_tek_queue_config_v2priority));
                    }
                }

                for (i0 = 0; i0 < this->u.link.priority_count; i0++)
                {
                    if (!bcmolt_epon_oam_tek_queue_config_v2priority_unpack(&this->u.link.priorities[i0], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_QUEUE_CONFIG_V2SUBTYPE_PORT:
            {
                uint8_t i1;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.port.priority_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.port.priority_count > 0) && (this->u.port.priorities == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"priorities\" of struct \"bcmolt_epon_oam_tek_queue_config_v2base_port\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.port.priorities = (bcmolt_epon_oam_tek_queue_config_v2priority *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.port.priority_count * sizeof(bcmolt_epon_oam_tek_queue_config_v2priority));
                    }
                }

                for (i1 = 0; i1 < this->u.port.priority_count; i1++)
                {
                    if (!bcmolt_epon_oam_tek_queue_config_v2priority_unpack(&this->u.port.priorities[i1], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_QUEUE_CONFIG_V2SUBTYPE_TERMINATOR:
            {
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_queue_config_v2base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_tek_queue_config_v2subtype subtype;
    if (!bcmolt_epon_oam_tek_queue_config_v2subtype_unpack(&subtype, packed))
    {
        return BCMOS_FALSE;
    }

    switch (subtype)
    {
        case BCMOLT_EPON_OAM_TEK_QUEUE_CONFIG_V2SUBTYPE_HEADER:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_QUEUE_CONFIG_V2SUBTYPE_LINK:
            {
                uint8_t priority_count;
                uint8_t i0;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &priority_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_tek_queue_config_v2priority) * priority_count);
                for (i0 = 0; i0 < priority_count; i0++)
                {
                    if (!bcmolt_epon_oam_tek_queue_config_v2priority_scan(packed, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_QUEUE_CONFIG_V2SUBTYPE_PORT:
            {
                uint8_t priority_count;
                uint8_t i1;
                if (!bcmolt_epon_oam_buf_read_u8(packed, &priority_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_tek_queue_config_v2priority) * priority_count);
                for (i1 = 0; i1 < priority_count; i1++)
                {
                    if (!bcmolt_epon_oam_tek_queue_config_v2priority_scan(packed, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_QUEUE_CONFIG_V2SUBTYPE_TERMINATOR:
            {
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_sequence_number_pack(bcmolt_epon_oam_tek_sequence_number *this, bcmolt_epon_oam_buf *buf)
{
    uint16_t ret = 0;
    ret |= ((this->end_of_sequence & 0x0001) << 15);
    ret |= (this->sequence_number & 0x7FFF);
    if (!bcmolt_epon_oam_buf_write_u16(buf, ret))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_sequence_number_unpack(bcmolt_epon_oam_tek_sequence_number *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint16_t val;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &val))
    {
        return BCMOS_FALSE;
    }

    this->end_of_sequence = ((val >> 15) & 0x0001);
    this->sequence_number = (val & 0x7FFF);
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_sequence_number_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 2);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_onu_clock_transport_config_pack(bcmolt_epon_oam_onu_clock_transport_config *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_clock_transport_key_pack(this->key, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_bool(buf, this->re_init))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_bool(buf, this->tod_enable))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_bool(buf, this->one_pps_enable))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_s32(buf, this->one_pps_offset))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->round_trip_time))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->one_pps_half_period))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_onu_clock_transport_config_unpack(bcmolt_epon_oam_onu_clock_transport_config *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_clock_transport_key_unpack(&this->key, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_bool(buf, &this->re_init))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_bool(buf, &this->tod_enable))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_bool(buf, &this->one_pps_enable))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_s32(buf, &this->one_pps_offset))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->round_trip_time))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->one_pps_half_period))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_onu_clock_transport_config_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 16);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_mcast_domain_port_info_pack(bcmolt_epon_oam_oam_mcast_domain_port_info *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u8(buf, this->port))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->group_limit))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->fc_limit))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->action))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->up_epon_vid))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->up_uni_vid))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->up_link))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->dnq))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->upq))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_mcast_domain_port_info_unpack(bcmolt_epon_oam_oam_mcast_domain_port_info *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->port))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->group_limit))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->fc_limit))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->action))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->up_epon_vid))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->up_uni_vid))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->up_link))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->dnq))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->upq))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_mcast_domain_port_info_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 11);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_mcast_domain_info_pack(bcmolt_epon_oam_oam_mcast_domain_info *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t i0;
    if (!bcmolt_epon_oam_buf_write_u8(buf, this->id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->dn_link))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_domain_option_pack(this->options, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_forward_qualifier_pack(this->fwd_qual, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->reserved))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->action))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->dn_epon_vid))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->dn_uni_vid))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->num_port))
    {
        return BCMOS_FALSE;
    }

    if ((this->num_port > 0) && (this->port_info == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"port_info\" of struct \"bcmolt_epon_oam_oam_mcast_domain_info\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->num_port; i0++)
    {
        if (!bcmolt_epon_oam_oam_mcast_domain_port_info_pack(&this->port_info[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_oam_mcast_domain_info_get_packed_length(bcmolt_epon_oam_oam_mcast_domain_info *this)
{
    return 12 + (11 * this->num_port);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_mcast_domain_info_unpack(bcmolt_epon_oam_oam_mcast_domain_info *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint8_t i0;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->dn_link))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_domain_option_unpack(&this->options, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_forward_qualifier_unpack(&this->fwd_qual, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->reserved))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->action))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->dn_epon_vid))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->dn_uni_vid))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->num_port))
    {
        return BCMOS_FALSE;
    }

    if ((this->num_port > 0) && (this->port_info == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"port_info\" of struct \"bcmolt_epon_oam_oam_mcast_domain_info\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->port_info = (bcmolt_epon_oam_oam_mcast_domain_port_info *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->num_port * sizeof(bcmolt_epon_oam_oam_mcast_domain_port_info));
        }
    }

    for (i0 = 0; i0 < this->num_port; i0++)
    {
        if (!bcmolt_epon_oam_oam_mcast_domain_port_info_unpack(&this->port_info[i0], buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_mcast_domain_info_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    uint8_t num_port;
    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 2))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 2))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 2))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(packed, &num_port))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_oam_mcast_domain_port_info) * num_port);
    if (!bcmolt_epon_oam_buf_skip(packed, num_port * 11))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_mcast_domain_record_pack(bcmolt_epon_oam_oam_mcast_domain_record *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t i0;
    if (!bcmolt_epon_oam_buf_write_u8(buf, this->num_domains))
    {
        return BCMOS_FALSE;
    }

    if ((this->num_domains > 0) && (this->domain == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"domain\" of struct \"bcmolt_epon_oam_oam_mcast_domain_record\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->num_domains; i0++)
    {
        if (!bcmolt_epon_oam_oam_mcast_domain_info_pack(&this->domain[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_oam_mcast_domain_record_get_packed_length(bcmolt_epon_oam_oam_mcast_domain_record *this)
{
    uint32_t count = 1;
    uint32_t i0;
    if ((this->num_domains > 0) && (this->domain == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"num_domains\" of struct \"bcmolt_epon_oam_oam_mcast_domain_record\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return 0;
    }

    for (i0 = 0; i0 < this->num_domains; i0++)
    {
        count += bcmolt_epon_oam_oam_mcast_domain_info_get_packed_length(&this->domain[i0]);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_mcast_domain_record_unpack(bcmolt_epon_oam_oam_mcast_domain_record *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint8_t i0;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->num_domains))
    {
        return BCMOS_FALSE;
    }

    if ((this->num_domains > 0) && (this->domain == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"domain\" of struct \"bcmolt_epon_oam_oam_mcast_domain_record\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->domain = (bcmolt_epon_oam_oam_mcast_domain_info *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->num_domains * sizeof(bcmolt_epon_oam_oam_mcast_domain_info));
        }
    }

    for (i0 = 0; i0 < this->num_domains; i0++)
    {
        if (!bcmolt_epon_oam_oam_mcast_domain_info_unpack(&this->domain[i0], buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_mcast_domain_record_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    uint8_t num_domains;
    uint8_t i0;
    if (!bcmolt_epon_oam_buf_read_u8(packed, &num_domains))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_oam_mcast_domain_info) * num_domains);
    for (i0 = 0; i0 < num_domains; i0++)
    {
        if (!bcmolt_epon_oam_oam_mcast_domain_info_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_attribute_value_pack(bcmolt_epon_oam_tek_attribute_value *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t preLenFieldPos;
    uint32_t bytesAfterLenField;
    if (!bcmolt_epon_oam_tek_leaf_attribute_pack(this->leaf, buf))
    {
        return BCMOS_FALSE;
    }

    if (this->width >= 0x0080)
    {
        bcmolt_epon_oam_buf_write_u8(buf, this->width);
        return BCMOS_TRUE;
    }

    preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

    /* skip over length field (we'll fill it in later) */
    if (!bcmolt_epon_oam_buf_skip(buf, 1))
    {
        return BCMOS_FALSE;
    }

    switch (this->leaf)
    {
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LUE_FIELD_SELECT:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.lue_field_select.idx))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_lue_field_select_entry_pack(&this->u.lue_field_select.def, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAMES_TX_OK:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.std_mac_frames_tx_ok.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_SINGLE_COLL_FRAMES:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.std_mac_single_coll_frames.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_MULTIPLE_COLL_FRAMES:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.std_mac_multiple_coll_frames.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAMES_RX_OK:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.std_mac_frames_rx_ok.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FCS_ERR:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.std_mac_fcs_err.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_ALIGN_ERR:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.std_mac_align_err.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_OCTETS_TX_OK:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.std_mac_octets_tx_ok.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_LATE_COLLISIONS:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.std_mac_late_collisions.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_EXCESSIVE_COLLISIONS:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.std_mac_excessive_collisions.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_OCTETS_RX_OK:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.std_mac_octets_rx_ok.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_MCAST_FRAMES_TX_OK:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.std_mac_mcast_frames_tx_ok.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_BCAST_FRAMES_TX_OK:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.std_mac_bcast_frames_tx_ok.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_MCAST_FRAMES_RX_OK:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.std_mac_mcast_frames_rx_ok.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_BCAST_FRAMES_RX_OK:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.std_mac_bcast_frames_rx_ok.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_IN_RANGE_LEN_ERR:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.std_mac_in_range_len_err.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAME_TOO_LONG:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.std_mac_frame_too_long.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_ENABLE_STATUS:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.std_mac_enable_status.enabled))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_PHY_SYMBOL_ERR_DURING_CARRIER:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.std_phy_symbol_err_during_carrier.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_PAUSE_TX:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.std_mac_ctrl_pause_tx.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_PAUSE_RX:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.std_mac_ctrl_pause_rx.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_OAM_LOCAL_ERR_FRAME_SECS_EVENT:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.std_oam_local_err_frame_secs_event.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_OAM_EMUL_CRC8ERR:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.std_oam_emul_crc8err.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_MAC_CTRL_FRAMES_TX:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.std_mpcp_mac_ctrl_frames_tx.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_MAC_CTRL_FRAMES_RX:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.std_mpcp_mac_ctrl_frames_rx.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_TX_REG_ACK:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.std_mpcp_tx_reg_ack.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_TX_REG_REQUEST:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.std_mpcp_tx_reg_request.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_TX_REPORT:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.std_mpcp_tx_report.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_RX_GATE:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.std_mpcp_rx_gate.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_RX_REGISTER:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.std_mpcp_rx_register.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DYN_LEARN_TBL_SIZE:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.dyn_learn_tbl_size.table_size))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DYN_LEARN_AGE_LIMIT:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.dyn_learn_age_limit.age_limit))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_UNICAST_FRAMES:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.rx_unicast_frames.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_UNICAST_FRAMES:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.tx_unicast_frames.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME_TOO_SHORT:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.rx_frame_too_short.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME64:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.rx_frame64.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME65TO127:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.rx_frame65to127.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME128TO255:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.rx_frame128to255.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME256TO511:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.rx_frame256to511.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME512TO1023:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.rx_frame512to1023.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME1024TO1518:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.rx_frame1024to1518.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME1519PLUS:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.rx_frame1519plus.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME64:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.tx_frame64.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME65TO127:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.tx_frame65to127.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME128TO255:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.tx_frame128to255.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME256TO511:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.tx_frame256to511.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME512TO1023:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.tx_frame512to1023.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME1024TO1518:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.tx_frame1024to1518.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME1519PLUS:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.tx_frame1519plus.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_DELAY_THRESHOLD:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.tx_delay_threshold.delay_threshold))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_DELAY:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.tx_delay.delay))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAMES_DROPPED:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.tx_frames_dropped.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_BYTES_DROPPED:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.tx_bytes_dropped.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_BYTES_DELAYED:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.tx_bytes_delayed.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_BYTES_UNUSED:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.tx_bytes_unused.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_DELAY_THRESHOLD:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.rx_delay_threshold.delay_threshold))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_DELAY:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.rx_delay.delay))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAMES_DROPPED:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.rx_frames_dropped.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_BYTES_DROPPED:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.rx_bytes_dropped.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_BYTES_DELAYED:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.rx_bytes_delayed.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_STAT_THRESHOLD:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.port_stat_threshold.statistic_id))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.port_stat_threshold.rising_threshold))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.port_stat_threshold.falling_threshold))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LINK_STAT_THRESHOLD:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.link_stat_threshold.statistic_id))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.link_stat_threshold.rising_threshold))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.link_stat_threshold.falling_threshold))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ENCRYPT_KEY_EXPIRY_TIME:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.encrypt_key_expiry_time.time))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LEN_ERROR_DISCARD:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.len_error_discard.len_error_discard))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DYN_MAC_TBL:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_REPORT_THRESHOLDS:
            {
                uint32_t i0;
                if ((this->u.report_thresholds.thresholds_count > 0) && (this->u.report_thresholds.thresholds == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"thresholds\" of struct \"bcmolt_epon_oam_tek_attribute_value_report_thresholds\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i0 = 0; i0 < this->u.report_thresholds.thresholds_count; i0++)
                {
                    if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.report_thresholds.thresholds[i0]))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_VLAN_ETHERTYPE:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.vlan_ethertype.vlan_ether_type))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.vlan_ethertype.use_for_upstream))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.vlan_ethertype.use_for_downstream))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_CAPABILITY:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.port_capability.current_caps))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.port_capability.physical_caps))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_NEW_DN_FILTER_TBL:
            {
                uint32_t i1;
                if ((this->u.new_dn_filter_tbl.rules_count > 0) && (this->u.new_dn_filter_tbl.rules == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"rules\" of struct \"bcmolt_epon_oam_tek_attribute_value_new_dn_filter_tbl\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i1 = 0; i1 < this->u.new_dn_filter_tbl.rules_count; i1++)
                {
                    if (!bcmolt_epon_oam_tek_onu_rule_pack(&this->u.new_dn_filter_tbl.rules[i1], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_NEW_UP_FILTER_TBL:
            {
                uint32_t i2;
                if ((this->u.new_up_filter_tbl.rules_count > 0) && (this->u.new_up_filter_tbl.rules == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"rules\" of struct \"bcmolt_epon_oam_tek_attribute_value_new_up_filter_tbl\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i2 = 0; i2 < this->u.new_up_filter_tbl.rules_count; i2++)
                {
                    if (!bcmolt_epon_oam_tek_onu_rule_pack(&this->u.new_up_filter_tbl.rules[i2], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ARP_REPLICATE_DEST:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.arp_replicate_dest.destination_bitmap))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LACP_DEST:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.lacp_dest.destination_bitmap))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ONU_IGMP_VLAN:
            {
                uint8_t i3;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_igmp_vlan.action_for_unman_grp))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_igmp_vlan.vlans_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.onu_igmp_vlan.vlans_count > 0) && (this->u.onu_igmp_vlan.vlans == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vlans\" of struct \"bcmolt_epon_oam_tek_attribute_value_onu_igmp_vlan\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i3 = 0; i3 < this->u.onu_igmp_vlan.vlans_count; i3++)
                {
                    if (!bcmolt_epon_oam_tek_onu_igmp_vlan_pack(&this->u.onu_igmp_vlan.vlans[i3], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DYN_LEARNING_MODE:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.dyn_learning_mode.learning_mode))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MIN_MAC_LIMIT:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.min_mac_limit.limit))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ONU_AGGREGATE_LIMIT:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_aggregate_limit.limit))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_NVS_SCRATCHPAD:
            {
                if ((this->u.nvs_scratchpad.data_count > 0) && (this->u.nvs_scratchpad.data == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"data\" of struct \"bcmolt_epon_oam_tek_attribute_value_nvs_scratchpad\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.nvs_scratchpad.data, this->u.nvs_scratchpad.data_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FLOOD_UNKNOWN:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.flood_unknown.flood_unknown_opt))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LOCAL_SWITCHING:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.local_switching.local_switch_opt))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DOWN_BURST_TOLL:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.down_burst_toll.down_burst_toll_opt))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FEC_MODE:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.fec_mode.downstream_fec))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.fec_mode.upstream_fec))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POWER_MON_TEMPERATURE:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.power_mon_temperature.temperature))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POWER_MON_VCC:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.power_mon_vcc.vcc))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POWER_MON_TX_BIAS:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.power_mon_tx_bias.bias))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POWER_MON_TX_POWER:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.power_mon_tx_power.power))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POWER_MON_RX_POWER:
            {
                if (!bcmolt_epon_oam_buf_write_u64(buf, this->u.power_mon_rx_power.power))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_NETWORK_PON_MAP:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.network_pon_map.network_epon_ports_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.network_pon_map.network_epon_ports_count > 0) && (this->u.network_pon_map.network_epon_ports == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"network_epon_ports\" of struct \"bcmolt_epon_oam_tek_attribute_value_network_pon_map\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.network_pon_map.network_epon_ports, this->u.network_pon_map.network_epon_ports_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PSSTATE:
            {
                if (!bcmolt_epon_oam_onu_psstate_pack(this->u.psstate.state, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_SLE_MODE:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.sle_mode.field_select))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LEARN_TABLE_MODE:
            {
                if (!bcmolt_epon_oam_tek_learn_table_mode_pack(this->u.learn_table_mode.learn_table_mode, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TRANSCEIVER_SIGNAL_DETECT:
            {
                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.transceiver_signal_detect.signal_detect))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_CROSSBAR_CONFIG:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.crossbar_config.user_port_to_network_port_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.crossbar_config.user_port_to_network_port_count > 0) && (this->u.crossbar_config.user_port_to_network_port == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"user_port_to_network_port\" of struct \"bcmolt_epon_oam_tek_attribute_value_crossbar_config\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.crossbar_config.user_port_to_network_port, this->u.crossbar_config.user_port_to_network_port_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TRANSCEIVER_BURST_ACTIVITY:
            {
                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.transceiver_burst_activity.burst_activity))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_CONTROL_PORT:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.control_port.network_port))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_VLAN_DESTINATIONS:
            {
                uint8_t i4;
                if (!bcmolt_epon_oam_tek_vlan_destination_match_mode_pack(this->u.vlan_destinations.match_mode, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_tek_vlan_destination_flags_pack(this->u.vlan_destinations.flags, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.vlan_destinations.default_link_index))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.vlan_destinations.default_queue_index))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.vlan_destinations.mappings_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.vlan_destinations.mappings_count > 0) && (this->u.vlan_destinations.mappings == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"mappings\" of struct \"bcmolt_epon_oam_tek_attribute_value_vlan_destinations\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (this->u.vlan_destinations.mappings_count > 16)
                {
                    return BCMOS_FALSE;
                }

                for (i4 = 0; i4 < this->u.vlan_destinations.mappings_count; i4++)
                {
                    if (!bcmolt_epon_oam_tek_vlan_destination_mapping_pack(&this->u.vlan_destinations.mappings[i4], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ENCRYPTION_MODE:
            {
                if (!bcmolt_epon_oam_tek_encryption_mode_pack(this->u.encryption_mode.mode, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_tek_encryption_options_pack(this->u.encryption_mode.options, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_INTERNAL_VERSION:
            {
                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.internal_version.stream))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.internal_version.revision))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FIRMWARE_TIMESTAMP:
            {
                if (!bcmolt_epon_oam_tek_firmware_timestamp_pack(&this->u.firmware_timestamp.timestamp, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ONU_RULE:
            {
                if (!bcmolt_epon_oam_tek_attribute_value_rule_pack(&this->u.onu_rule.rule, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POLICER:
            {
                if (!bcmolt_epon_oam_flow_direction_pack(this->u.policer.direction, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.policer.policer_id))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.policer.burst_size))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.policer.traffic_rate))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_UNI_SHAPER:
            {
                uint8_t i5;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.uni_shaper.number_of_shapers))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.uni_shaper.number_of_shapers > 0) && (this->u.uni_shaper.uni_shaper == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"uni_shaper\" of struct \"bcmolt_epon_oam_tek_attribute_value_uni_shaper\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i5 = 0; i5 < this->u.uni_shaper.number_of_shapers; i5++)
                {
                    if (!bcmolt_epon_oam_uni_shaper_pack(&this->u.uni_shaper.uni_shaper[i5], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EXT_FIRMWARE_VERSION:
            {
                if (!bcmolt_epon_oam_extended_load_label_pack(&this->u.ext_firmware_version.version, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ENCRYPTION_KEY:
            {
                if (!bcmolt_epon_oam_direction_pack(this->u.encryption_key.direction, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.encryption_key.key_index))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.encryption_key.key_length))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.encryption_key.key_length > 0) && (this->u.encryption_key.key_data == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"key_data\" of struct \"bcmolt_epon_oam_tek_attribute_value_encryption_key\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.encryption_key.key_data, this->u.encryption_key.key_length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FILE_INFO:
            {
                if (!bcmolt_epon_oam_file_info_base_pack(&this->u.file_info.file_info, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_SYSTEM_RULE_OPTIONS:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.system_rule_options.system_rule_options))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MTU:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.mtu.mtu))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_NVS_STATE:
            {
                if (!bcmolt_epon_oam_nvs_state_pack(this->u.nvs_state.state, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_QUEUEPRIMAP:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.queueprimap.priority_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.queueprimap.priority_count > 0) && (this->u.queueprimap.priority_map == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"priority_map\" of struct \"bcmolt_epon_oam_tek_attribute_value_queueprimap\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.queueprimap.priority_map, this->u.queueprimap.priority_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_DOWN_BIT_LOADING:
            {
                if (!bcmolt_epon_oam_oam_epoc_bit_loading_pack(&this->u.epoc_down_bit_loading.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UP_BIT_LOADING:
            {
                if (!bcmolt_epon_oam_oam_epoc_bit_loading_pack(&this->u.epoc_up_bit_loading.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_SDM_PHASE:
            {
                if (!bcmolt_epon_oam_oam_epoc_stat_pack(&this->u.epoc_sdm_phase.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_SDM_AMPLITUDE:
            {
                if (!bcmolt_epon_oam_oam_epoc_stat_pack(&this->u.epoc_sdm_amplitude.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_SDM_QUANTIZER:
            {
                if (!bcmolt_epon_oam_oam_epoc_stat_pack(&this->u.epoc_sdm_quantizer.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UNUSED0:
            {
                if (!bcmolt_epon_oam_oam_epoc_stat_pack(&this->u.epoc_unused0.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UNUSED1:
            {
                if (!bcmolt_epon_oam_oam_epoc_stat_pack(&this->u.epoc_unused1.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UNUSED2:
            {
                if (!bcmolt_epon_oam_oam_epoc_stat_pack(&this->u.epoc_unused2.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UNUSED3:
            {
                if (!bcmolt_epon_oam_oam_epoc_stat_pack(&this->u.epoc_unused3.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UNUSED4:
            {
                if (!bcmolt_epon_oam_oam_epoc_stat_pack(&this->u.epoc_unused4.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_QUEUE_CONFIG_V2:
            {
                if (!bcmolt_epon_oam_tek_queue_config_v2base_pack(&this->u.queue_config_v2.queue_config, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FEATURE_SET:
            {
                if (!bcmolt_epon_oam_tek_feature_set_pack(this->u.feature_set.feature_set, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_PHY_TYPE:
            {
                if (!bcmolt_epon_oam_std_phy_type_pack(this->u.std_phy_type.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_SEQUENCE_NUMBER:
            {
                if (!bcmolt_epon_oam_tek_sequence_number_pack(&this->u.sequence_number.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MPCP_CLOCK:
            {
                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.mpcp_clock.pulse_time))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MPCP_CLOCK_COMPENSATE:
            {
                if (!bcmolt_epon_oam_onu_clock_transport_config_pack(&this->u.mpcp_clock_compensate.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MCAST_GLOBAL_CONFIG:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.mcast_global_config.robustness_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.mcast_global_config.lmq_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.mcast_global_config.fast_leave_enable))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_mcast_snoop_mode_pack(this->u.mcast_global_config.mode, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ipmc_global_options_pack(this->u.mcast_global_config.options, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MCAST_DOMAIN_CONFIG:
            {
                if (!bcmolt_epon_oam_oam_mcast_domain_record_pack(&this->u.mcast_domain_config.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ONU_HOLDOVER:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.onu_holdover.time))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_tek_holdover_flags_pack(this->u.onu_holdover.flags, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ALARM_THRESHOLD:
            {
                if (!bcmolt_epon_oam_tek_alarm_code_pack(this->u.alarm_threshold.alarm_code, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.alarm_threshold.raise_threshold))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.alarm_threshold.clear_threshold))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FAILSAFE:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.failsafe.count_of_failsafe_mech))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_bool(buf, this->u.failsafe.failsafe_state))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_STATS_THRESHOLD_INTERVAL:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.port_stats_threshold_interval.statistic_id))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.port_stats_threshold_interval.interval))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LINK_STATS_THRESHOLD_INTERVAL:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.link_stats_threshold_interval.statistic_id))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.link_stats_threshold_interval.interval))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_DUPLEX_STATUS:
            {
                if (!bcmolt_epon_oam_mac_duplex_status_pack(this->u.std_mac_duplex_status.status, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_ADMIN_STATE:
            {
                if (!bcmolt_epon_oam_autonegotiate_admin_state_pack(this->u.std_auto_neg_admin_state.state, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAU_MEDIA_AVAIL:
            {
                if (!bcmolt_epon_oam_mau_media_available_pack(this->u.std_mau_media_avail.status, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MDI_CROSSOVER:
            {
                if (!bcmolt_epon_oam_mdi_mode_pack(this->u.mdi_crossover.mode, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_ADDR:
            {
                if (!bcmolt_epon_oam_buf_write_mac_address(buf, this->u.std_mac_addr.address))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_BCAST_RATE_LIMIT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_BYPASS_SOFT_LEARN:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_CHIP_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_CHIP_VERSION:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_COS_TRANSLATION:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_CTL_VLAN_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DN_FILTER_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EGRESS_SHAPING:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EXTENDED_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FIRMWARE_VER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_IGMP_FRAME_RATE_LIMIT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_INGRESS_POLICING:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_IPMC_UNKNOWN_LEAVE_FWD:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_JEDEC_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LEARN_MODE_RULE_UPDATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LINK_STATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LUE_FIELD_SELECT_LIST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MCAST_GROUP_INFO:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_DYNAMIC_ENTRIES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_VLAN_MEMBERSHIP:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_VLAN_POLICY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PRI_ENQUEUING:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_SEARCH_CONFIG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STATIC_MAC_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_AD_SELECT_ABLE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_AD_TECH:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_AUTO_CFG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_LOCAL_SELECT_ABLE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_LOCAL_TECH:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_REMOTE_SIG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_RX_SELECT_ABLE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_RX_TECH:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_FEC_ABILITY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_FEC_CORRECTED_BLOCKS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_FEC_MODE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_FEC_UNCORRECTABLE_BLOCKS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CAPABILITIES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CARRIER_SENSE_ERR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_COLLISION_FRAMES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_FRAMES_RX:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_FRAMES_TX:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_FUNCS_SUPPORTED:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_PAUSE_DELAY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_UNSUPPORTED_OP_RX:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FR_EXCESSIVE_DEFERRAL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAMES_DEFERRED:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAMES_LOST_MAC_RX_ERR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAMES_LOST_MAC_TX_ERR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_MCAST_ADDR_LIST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_MCAST_RX_STATUS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_OUT_OF_RANGE_LEN_ERR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_PROMISCUOUS_STATUS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_TX_ENABLE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_DISCOVERY_TIMEOUT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_DISCOVERY_WINDOW_TX:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_RX_REG_ACK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_RX_REG_REQUEST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_RX_REPORT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_TX_GATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_TX_REGISTER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_PHY_ADMIN_STATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_PHY_TYPE_LIST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_UP_FILTER_TBL:
        default:
            {
            }
            break;
    }

    bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
    if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tek_attribute_value_get_packed_length(bcmolt_epon_oam_tek_attribute_value *this)
{
    if (this->width >= 0x0080)
    {
        return this->width;
    }
    else
    {
        uint32_t count = 3;
        switch (this->leaf)
        {
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LUE_FIELD_SELECT:
                {
                    count += 5;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAMES_TX_OK:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_SINGLE_COLL_FRAMES:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_MULTIPLE_COLL_FRAMES:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAMES_RX_OK:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FCS_ERR:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_ALIGN_ERR:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_OCTETS_TX_OK:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_LATE_COLLISIONS:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_EXCESSIVE_COLLISIONS:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_OCTETS_RX_OK:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_MCAST_FRAMES_TX_OK:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_BCAST_FRAMES_TX_OK:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_MCAST_FRAMES_RX_OK:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_BCAST_FRAMES_RX_OK:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_IN_RANGE_LEN_ERR:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAME_TOO_LONG:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_ENABLE_STATUS:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_PHY_SYMBOL_ERR_DURING_CARRIER:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_PAUSE_TX:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_PAUSE_RX:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_OAM_LOCAL_ERR_FRAME_SECS_EVENT:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_OAM_EMUL_CRC8ERR:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_MAC_CTRL_FRAMES_TX:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_MAC_CTRL_FRAMES_RX:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_TX_REG_ACK:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_TX_REG_REQUEST:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_TX_REPORT:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_RX_GATE:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_RX_REGISTER:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DYN_LEARN_TBL_SIZE:
                {
                    count += 2;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DYN_LEARN_AGE_LIMIT:
                {
                    count += 2;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_UNICAST_FRAMES:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_UNICAST_FRAMES:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME_TOO_SHORT:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME64:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME65TO127:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME128TO255:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME256TO511:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME512TO1023:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME1024TO1518:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME1519PLUS:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME64:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME65TO127:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME128TO255:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME256TO511:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME512TO1023:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME1024TO1518:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME1519PLUS:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_DELAY_THRESHOLD:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_DELAY:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAMES_DROPPED:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_BYTES_DROPPED:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_BYTES_DELAYED:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_BYTES_UNUSED:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_DELAY_THRESHOLD:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_DELAY:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAMES_DROPPED:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_BYTES_DROPPED:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_BYTES_DELAYED:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_STAT_THRESHOLD:
                {
                    count += 10;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LINK_STAT_THRESHOLD:
                {
                    count += 10;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ENCRYPT_KEY_EXPIRY_TIME:
                {
                    count += 2;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LEN_ERROR_DISCARD:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DYN_MAC_TBL:
                {
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_REPORT_THRESHOLDS:
                {
                    count += (2 * this->u.report_thresholds.thresholds_count);
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_VLAN_ETHERTYPE:
                {
                    count += 4;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_CAPABILITY:
                {
                    count += 4;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_NEW_DN_FILTER_TBL:
                {
                    uint32_t i0;
                    if ((this->u.new_dn_filter_tbl.rules_count > 0) && (this->u.new_dn_filter_tbl.rules == NULL))
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"rules_count\" of struct \"bcmolt_epon_oam_tek_attribute_value\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return 0;
                    }

                    for (i0 = 0; i0 < this->u.new_dn_filter_tbl.rules_count; i0++)
                    {
                        count += bcmolt_epon_oam_tek_onu_rule_get_packed_length(&this->u.new_dn_filter_tbl.rules[i0]);
                    }
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_NEW_UP_FILTER_TBL:
                {
                    uint32_t i1;
                    if ((this->u.new_up_filter_tbl.rules_count > 0) && (this->u.new_up_filter_tbl.rules == NULL))
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"rules_count\" of struct \"bcmolt_epon_oam_tek_attribute_value\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return 0;
                    }

                    for (i1 = 0; i1 < this->u.new_up_filter_tbl.rules_count; i1++)
                    {
                        count += bcmolt_epon_oam_tek_onu_rule_get_packed_length(&this->u.new_up_filter_tbl.rules[i1]);
                    }
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ARP_REPLICATE_DEST:
                {
                    count += 2;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LACP_DEST:
                {
                    count += 2;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ONU_IGMP_VLAN:
                {
                    count += 2 + (5 * this->u.onu_igmp_vlan.vlans_count);
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DYN_LEARNING_MODE:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MIN_MAC_LIMIT:
                {
                    count += 2;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ONU_AGGREGATE_LIMIT:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_NVS_SCRATCHPAD:
                {
                    count += this->u.nvs_scratchpad.data_count;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FLOOD_UNKNOWN:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LOCAL_SWITCHING:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DOWN_BURST_TOLL:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FEC_MODE:
                {
                    count += 2;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POWER_MON_TEMPERATURE:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POWER_MON_VCC:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POWER_MON_TX_BIAS:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POWER_MON_TX_POWER:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POWER_MON_RX_POWER:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_NETWORK_PON_MAP:
                {
                    count += 1 + this->u.network_pon_map.network_epon_ports_count;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PSSTATE:
                {
                    count += 2;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_SLE_MODE:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LEARN_TABLE_MODE:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TRANSCEIVER_SIGNAL_DETECT:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_CROSSBAR_CONFIG:
                {
                    count += 1 + this->u.crossbar_config.user_port_to_network_port_count;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TRANSCEIVER_BURST_ACTIVITY:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_CONTROL_PORT:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_VLAN_DESTINATIONS:
                {
                    count += 5 + (4 * this->u.vlan_destinations.mappings_count);
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ENCRYPTION_MODE:
                {
                    count += 3;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_INTERNAL_VERSION:
                {
                    count += 8;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FIRMWARE_TIMESTAMP:
                {
                    count += 7;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ONU_RULE:
                {
                    count += bcmolt_epon_oam_tek_attribute_value_rule_get_packed_length(&this->u.onu_rule.rule);
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POLICER:
                {
                    count += 10;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_UNI_SHAPER:
                {
                    count += 1 + (10 * this->u.uni_shaper.number_of_shapers);
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EXT_FIRMWARE_VERSION:
                {
                    count += 5;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ENCRYPTION_KEY:
                {
                    count += 3 + this->u.encryption_key.key_length;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FILE_INFO:
                {
                    count += bcmolt_epon_oam_file_info_base_get_packed_length(&this->u.file_info.file_info);
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_SYSTEM_RULE_OPTIONS:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MTU:
                {
                    count += 2;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_NVS_STATE:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_QUEUEPRIMAP:
                {
                    count += 1 + this->u.queueprimap.priority_count;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_DOWN_BIT_LOADING:
                {
                    count += 64;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UP_BIT_LOADING:
                {
                    count += 64;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_SDM_PHASE:
                {
                    count += bcmolt_epon_oam_oam_epoc_stat_get_packed_length(&this->u.epoc_sdm_phase.value);
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_SDM_AMPLITUDE:
                {
                    count += bcmolt_epon_oam_oam_epoc_stat_get_packed_length(&this->u.epoc_sdm_amplitude.value);
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_SDM_QUANTIZER:
                {
                    count += bcmolt_epon_oam_oam_epoc_stat_get_packed_length(&this->u.epoc_sdm_quantizer.value);
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UNUSED0:
                {
                    count += bcmolt_epon_oam_oam_epoc_stat_get_packed_length(&this->u.epoc_unused0.value);
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UNUSED1:
                {
                    count += bcmolt_epon_oam_oam_epoc_stat_get_packed_length(&this->u.epoc_unused1.value);
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UNUSED2:
                {
                    count += bcmolt_epon_oam_oam_epoc_stat_get_packed_length(&this->u.epoc_unused2.value);
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UNUSED3:
                {
                    count += bcmolt_epon_oam_oam_epoc_stat_get_packed_length(&this->u.epoc_unused3.value);
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UNUSED4:
                {
                    count += bcmolt_epon_oam_oam_epoc_stat_get_packed_length(&this->u.epoc_unused4.value);
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_QUEUE_CONFIG_V2:
                {
                    count += bcmolt_epon_oam_tek_queue_config_v2base_get_packed_length(&this->u.queue_config_v2.queue_config);
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FEATURE_SET:
                {
                    count += 2;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_PHY_TYPE:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_SEQUENCE_NUMBER:
                {
                    count += 2;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MPCP_CLOCK:
                {
                    count += 4;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MPCP_CLOCK_COMPENSATE:
                {
                    count += 16;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MCAST_GLOBAL_CONFIG:
                {
                    count += 6;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MCAST_DOMAIN_CONFIG:
                {
                    count += bcmolt_epon_oam_oam_mcast_domain_record_get_packed_length(&this->u.mcast_domain_config.value);
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ONU_HOLDOVER:
                {
                    count += 2;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ALARM_THRESHOLD:
                {
                    count += 9;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FAILSAFE:
                {
                    count += 2;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_STATS_THRESHOLD_INTERVAL:
                {
                    count += 4;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LINK_STATS_THRESHOLD_INTERVAL:
                {
                    count += 4;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_DUPLEX_STATUS:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_ADMIN_STATE:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAU_MEDIA_AVAIL:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MDI_CROSSOVER:
                {
                    count += 1;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_ADDR:
                {
                    count += 6;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_BCAST_RATE_LIMIT:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_BYPASS_SOFT_LEARN:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_CHIP_ID:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_CHIP_VERSION:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_COS_TRANSLATION:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_CTL_VLAN_ID:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DN_FILTER_TBL:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EGRESS_SHAPING:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EXTENDED_ID:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FIRMWARE_VER:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_IGMP_FRAME_RATE_LIMIT:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_INGRESS_POLICING:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_IPMC_UNKNOWN_LEAVE_FWD:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_JEDEC_ID:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LEARN_MODE_RULE_UPDATE:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LINK_STATE:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LUE_FIELD_SELECT_LIST:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MCAST_GROUP_INFO:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_DYNAMIC_ENTRIES:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_VLAN_MEMBERSHIP:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_VLAN_POLICY:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PRI_ENQUEUING:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_SEARCH_CONFIG:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STATIC_MAC_TBL:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_AD_SELECT_ABLE:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_AD_TECH:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_AUTO_CFG:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_ID:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_LOCAL_SELECT_ABLE:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_LOCAL_TECH:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_REMOTE_SIG:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_RX_SELECT_ABLE:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_RX_TECH:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_FEC_ABILITY:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_FEC_CORRECTED_BLOCKS:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_FEC_MODE:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_FEC_UNCORRECTABLE_BLOCKS:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CAPABILITIES:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CARRIER_SENSE_ERR:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_COLLISION_FRAMES:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_FRAMES_RX:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_FRAMES_TX:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_FUNCS_SUPPORTED:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_ID:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_PAUSE_DELAY:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_UNSUPPORTED_OP_RX:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FR_EXCESSIVE_DEFERRAL:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAMES_DEFERRED:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAMES_LOST_MAC_RX_ERR:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAMES_LOST_MAC_TX_ERR:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_ID:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_MCAST_ADDR_LIST:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_MCAST_RX_STATUS:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_OUT_OF_RANGE_LEN_ERR:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_PROMISCUOUS_STATUS:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_TX_ENABLE:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_DISCOVERY_TIMEOUT:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_DISCOVERY_WINDOW_TX:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_RX_REG_ACK:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_RX_REG_REQUEST:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_RX_REPORT:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_TX_GATE:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_TX_REGISTER:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_PHY_ADMIN_STATE:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_PHY_TYPE_LIST:
            case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_UP_FILTER_TBL:
            default:
                {
                }
                break;
        }

        return count;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_attribute_value_unpack(bcmolt_epon_oam_tek_attribute_value *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    bcmolt_epon_oam_buf postLenBuf;
    if (!bcmolt_epon_oam_tek_leaf_attribute_unpack(&this->leaf, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->width))
    {
        return BCMOS_FALSE;
    }

    if (this->width >= 0x0080)
    {
        return BCMOS_TRUE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, (this->width == 0) ? 0x0080 : this->width, buf->curr);
    switch (this->leaf)
    {
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LUE_FIELD_SELECT:
            {
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.lue_field_select.idx))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_lue_field_select_entry_unpack(&this->u.lue_field_select.def, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAMES_TX_OK:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.std_mac_frames_tx_ok.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_SINGLE_COLL_FRAMES:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.std_mac_single_coll_frames.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_MULTIPLE_COLL_FRAMES:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.std_mac_multiple_coll_frames.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAMES_RX_OK:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.std_mac_frames_rx_ok.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FCS_ERR:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.std_mac_fcs_err.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_ALIGN_ERR:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.std_mac_align_err.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_OCTETS_TX_OK:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.std_mac_octets_tx_ok.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_LATE_COLLISIONS:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.std_mac_late_collisions.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_EXCESSIVE_COLLISIONS:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.std_mac_excessive_collisions.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_OCTETS_RX_OK:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.std_mac_octets_rx_ok.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_MCAST_FRAMES_TX_OK:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.std_mac_mcast_frames_tx_ok.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_BCAST_FRAMES_TX_OK:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.std_mac_bcast_frames_tx_ok.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_MCAST_FRAMES_RX_OK:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.std_mac_mcast_frames_rx_ok.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_BCAST_FRAMES_RX_OK:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.std_mac_bcast_frames_rx_ok.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_IN_RANGE_LEN_ERR:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.std_mac_in_range_len_err.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAME_TOO_LONG:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.std_mac_frame_too_long.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_ENABLE_STATUS:
            {
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.std_mac_enable_status.enabled))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_PHY_SYMBOL_ERR_DURING_CARRIER:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.std_phy_symbol_err_during_carrier.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_PAUSE_TX:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.std_mac_ctrl_pause_tx.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_PAUSE_RX:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.std_mac_ctrl_pause_rx.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_OAM_LOCAL_ERR_FRAME_SECS_EVENT:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.std_oam_local_err_frame_secs_event.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_OAM_EMUL_CRC8ERR:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.std_oam_emul_crc8err.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_MAC_CTRL_FRAMES_TX:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.std_mpcp_mac_ctrl_frames_tx.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_MAC_CTRL_FRAMES_RX:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.std_mpcp_mac_ctrl_frames_rx.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_TX_REG_ACK:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.std_mpcp_tx_reg_ack.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_TX_REG_REQUEST:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.std_mpcp_tx_reg_request.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_TX_REPORT:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.std_mpcp_tx_report.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_RX_GATE:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.std_mpcp_rx_gate.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_RX_REGISTER:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.std_mpcp_rx_register.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DYN_LEARN_TBL_SIZE:
            {
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.dyn_learn_tbl_size.table_size))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DYN_LEARN_AGE_LIMIT:
            {
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.dyn_learn_age_limit.age_limit))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_UNICAST_FRAMES:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.rx_unicast_frames.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_UNICAST_FRAMES:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.tx_unicast_frames.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME_TOO_SHORT:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.rx_frame_too_short.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME64:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.rx_frame64.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME65TO127:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.rx_frame65to127.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME128TO255:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.rx_frame128to255.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME256TO511:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.rx_frame256to511.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME512TO1023:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.rx_frame512to1023.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME1024TO1518:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.rx_frame1024to1518.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME1519PLUS:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.rx_frame1519plus.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME64:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.tx_frame64.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME65TO127:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.tx_frame65to127.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME128TO255:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.tx_frame128to255.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME256TO511:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.tx_frame256to511.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME512TO1023:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.tx_frame512to1023.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME1024TO1518:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.tx_frame1024to1518.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME1519PLUS:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.tx_frame1519plus.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_DELAY_THRESHOLD:
            {
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.tx_delay_threshold.delay_threshold))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_DELAY:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.tx_delay.delay))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAMES_DROPPED:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.tx_frames_dropped.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_BYTES_DROPPED:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.tx_bytes_dropped.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_BYTES_DELAYED:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.tx_bytes_delayed.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_BYTES_UNUSED:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.tx_bytes_unused.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_DELAY_THRESHOLD:
            {
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.rx_delay_threshold.delay_threshold))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_DELAY:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.rx_delay.delay))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAMES_DROPPED:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.rx_frames_dropped.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_BYTES_DROPPED:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.rx_bytes_dropped.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_BYTES_DELAYED:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.rx_bytes_delayed.value))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_STAT_THRESHOLD:
            {
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.port_stat_threshold.statistic_id))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.port_stat_threshold.rising_threshold))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.port_stat_threshold.falling_threshold))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LINK_STAT_THRESHOLD:
            {
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.link_stat_threshold.statistic_id))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.link_stat_threshold.rising_threshold))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.link_stat_threshold.falling_threshold))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ENCRYPT_KEY_EXPIRY_TIME:
            {
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.encrypt_key_expiry_time.time))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LEN_ERROR_DISCARD:
            {
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.len_error_discard.len_error_discard))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DYN_MAC_TBL:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_REPORT_THRESHOLDS:
            {
                uint32_t i0;
                this->u.report_thresholds.thresholds_count = bcmolt_epon_oam_tek_attribute_value_report_thresholds_count_thresholds(&postLenBuf);
                if ((this->u.report_thresholds.thresholds_count > 0) && (this->u.report_thresholds.thresholds == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"thresholds\" of struct \"bcmolt_epon_oam_tek_attribute_value_report_thresholds\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.report_thresholds.thresholds = (uint16_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.report_thresholds.thresholds_count * sizeof(uint16_t));
                    }
                }

                for (i0 = 0; i0 < this->u.report_thresholds.thresholds_count; i0++)
                {
                    if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.report_thresholds.thresholds[i0]))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_VLAN_ETHERTYPE:
            {
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.vlan_ethertype.vlan_ether_type))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_bool(&postLenBuf, &this->u.vlan_ethertype.use_for_upstream))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_bool(&postLenBuf, &this->u.vlan_ethertype.use_for_downstream))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_CAPABILITY:
            {
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.port_capability.current_caps))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.port_capability.physical_caps))
                {
                    /*Optional unpack fails do not cause errors */
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_NEW_DN_FILTER_TBL:
            {
                uint32_t i1;
                this->u.new_dn_filter_tbl.rules_count = bcmolt_epon_oam_tek_attribute_value_new_dn_filter_tbl_count_rules(&postLenBuf);
                if ((this->u.new_dn_filter_tbl.rules_count > 0) && (this->u.new_dn_filter_tbl.rules == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"rules\" of struct \"bcmolt_epon_oam_tek_attribute_value_new_dn_filter_tbl\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.new_dn_filter_tbl.rules = (bcmolt_epon_oam_tek_onu_rule *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.new_dn_filter_tbl.rules_count * sizeof(bcmolt_epon_oam_tek_onu_rule));
                    }
                }

                for (i1 = 0; i1 < this->u.new_dn_filter_tbl.rules_count; i1++)
                {
                    if (!bcmolt_epon_oam_tek_onu_rule_unpack(&this->u.new_dn_filter_tbl.rules[i1], &postLenBuf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_NEW_UP_FILTER_TBL:
            {
                uint32_t i2;
                this->u.new_up_filter_tbl.rules_count = bcmolt_epon_oam_tek_attribute_value_new_up_filter_tbl_count_rules(&postLenBuf);
                if ((this->u.new_up_filter_tbl.rules_count > 0) && (this->u.new_up_filter_tbl.rules == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"rules\" of struct \"bcmolt_epon_oam_tek_attribute_value_new_up_filter_tbl\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.new_up_filter_tbl.rules = (bcmolt_epon_oam_tek_onu_rule *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.new_up_filter_tbl.rules_count * sizeof(bcmolt_epon_oam_tek_onu_rule));
                    }
                }

                for (i2 = 0; i2 < this->u.new_up_filter_tbl.rules_count; i2++)
                {
                    if (!bcmolt_epon_oam_tek_onu_rule_unpack(&this->u.new_up_filter_tbl.rules[i2], &postLenBuf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ARP_REPLICATE_DEST:
            {
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.arp_replicate_dest.destination_bitmap))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LACP_DEST:
            {
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.lacp_dest.destination_bitmap))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ONU_IGMP_VLAN:
            {
                uint8_t i3;
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.onu_igmp_vlan.action_for_unman_grp))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.onu_igmp_vlan.vlans_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.onu_igmp_vlan.vlans_count > 0) && (this->u.onu_igmp_vlan.vlans == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vlans\" of struct \"bcmolt_epon_oam_tek_attribute_value_onu_igmp_vlan\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.onu_igmp_vlan.vlans = (bcmolt_epon_oam_tek_onu_igmp_vlan *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.onu_igmp_vlan.vlans_count * sizeof(bcmolt_epon_oam_tek_onu_igmp_vlan));
                    }
                }

                for (i3 = 0; i3 < this->u.onu_igmp_vlan.vlans_count; i3++)
                {
                    if (!bcmolt_epon_oam_tek_onu_igmp_vlan_unpack(&this->u.onu_igmp_vlan.vlans[i3], &postLenBuf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DYN_LEARNING_MODE:
            {
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.dyn_learning_mode.learning_mode))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MIN_MAC_LIMIT:
            {
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.min_mac_limit.limit))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ONU_AGGREGATE_LIMIT:
            {
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.onu_aggregate_limit.limit))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_NVS_SCRATCHPAD:
            {
                this->u.nvs_scratchpad.data_count = bcmolt_epon_oam_tek_attribute_value_nvs_scratchpad_count_data(&postLenBuf);
                if ((this->u.nvs_scratchpad.data_count > 0) && (this->u.nvs_scratchpad.data == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"data\" of struct \"bcmolt_epon_oam_tek_attribute_value_nvs_scratchpad\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.nvs_scratchpad.data = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.nvs_scratchpad.data_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.nvs_scratchpad.data, this->u.nvs_scratchpad.data_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FLOOD_UNKNOWN:
            {
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.flood_unknown.flood_unknown_opt))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LOCAL_SWITCHING:
            {
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.local_switching.local_switch_opt))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DOWN_BURST_TOLL:
            {
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.down_burst_toll.down_burst_toll_opt))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FEC_MODE:
            {
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.fec_mode.downstream_fec))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.fec_mode.upstream_fec))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POWER_MON_TEMPERATURE:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.power_mon_temperature.temperature))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POWER_MON_VCC:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.power_mon_vcc.vcc))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POWER_MON_TX_BIAS:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.power_mon_tx_bias.bias))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POWER_MON_TX_POWER:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.power_mon_tx_power.power))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POWER_MON_RX_POWER:
            {
                if (!bcmolt_epon_oam_buf_read_u64(&postLenBuf, &this->u.power_mon_rx_power.power))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_NETWORK_PON_MAP:
            {
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.network_pon_map.network_epon_ports_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.network_pon_map.network_epon_ports_count > 0) && (this->u.network_pon_map.network_epon_ports == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"network_epon_ports\" of struct \"bcmolt_epon_oam_tek_attribute_value_network_pon_map\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.network_pon_map.network_epon_ports = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.network_pon_map.network_epon_ports_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.network_pon_map.network_epon_ports, this->u.network_pon_map.network_epon_ports_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PSSTATE:
            {
                if (!bcmolt_epon_oam_onu_psstate_unpack(&this->u.psstate.state, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_SLE_MODE:
            {
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.sle_mode.field_select))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LEARN_TABLE_MODE:
            {
                if (!bcmolt_epon_oam_tek_learn_table_mode_unpack(&this->u.learn_table_mode.learn_table_mode, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TRANSCEIVER_SIGNAL_DETECT:
            {
                if (!bcmolt_epon_oam_buf_read_bool(&postLenBuf, &this->u.transceiver_signal_detect.signal_detect))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_CROSSBAR_CONFIG:
            {
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.crossbar_config.user_port_to_network_port_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.crossbar_config.user_port_to_network_port_count > 0) && (this->u.crossbar_config.user_port_to_network_port == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"user_port_to_network_port\" of struct \"bcmolt_epon_oam_tek_attribute_value_crossbar_config\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.crossbar_config.user_port_to_network_port = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.crossbar_config.user_port_to_network_port_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.crossbar_config.user_port_to_network_port, this->u.crossbar_config.user_port_to_network_port_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TRANSCEIVER_BURST_ACTIVITY:
            {
                if (!bcmolt_epon_oam_buf_read_bool(&postLenBuf, &this->u.transceiver_burst_activity.burst_activity))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_CONTROL_PORT:
            {
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.control_port.network_port))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_VLAN_DESTINATIONS:
            {
                uint8_t i4;
                if (!bcmolt_epon_oam_tek_vlan_destination_match_mode_unpack(&this->u.vlan_destinations.match_mode, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_tek_vlan_destination_flags_unpack(&this->u.vlan_destinations.flags, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.vlan_destinations.default_link_index))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.vlan_destinations.default_queue_index))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.vlan_destinations.mappings_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.vlan_destinations.mappings_count > 0) && (this->u.vlan_destinations.mappings == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"mappings\" of struct \"bcmolt_epon_oam_tek_attribute_value_vlan_destinations\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.vlan_destinations.mappings = (bcmolt_epon_oam_tek_vlan_destination_mapping *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.vlan_destinations.mappings_count * sizeof(bcmolt_epon_oam_tek_vlan_destination_mapping));
                    }
                }

                if (this->u.vlan_destinations.mappings_count > 16)
                {
                    return BCMOS_FALSE;
                }

                for (i4 = 0; i4 < this->u.vlan_destinations.mappings_count; i4++)
                {
                    if (!bcmolt_epon_oam_tek_vlan_destination_mapping_unpack(&this->u.vlan_destinations.mappings[i4], &postLenBuf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ENCRYPTION_MODE:
            {
                if (!bcmolt_epon_oam_tek_encryption_mode_unpack(&this->u.encryption_mode.mode, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_tek_encryption_options_unpack(&this->u.encryption_mode.options, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_INTERNAL_VERSION:
            {
                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.internal_version.stream))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.internal_version.revision))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FIRMWARE_TIMESTAMP:
            {
                if (!bcmolt_epon_oam_tek_firmware_timestamp_unpack(&this->u.firmware_timestamp.timestamp, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ONU_RULE:
            {
                if (!bcmolt_epon_oam_tek_attribute_value_rule_unpack(&this->u.onu_rule.rule, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POLICER:
            {
                if (!bcmolt_epon_oam_flow_direction_unpack(&this->u.policer.direction, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.policer.policer_id))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.policer.burst_size))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.policer.traffic_rate))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_UNI_SHAPER:
            {
                uint8_t i5;
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.uni_shaper.number_of_shapers))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.uni_shaper.number_of_shapers > 0) && (this->u.uni_shaper.uni_shaper == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"uni_shaper\" of struct \"bcmolt_epon_oam_tek_attribute_value_uni_shaper\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.uni_shaper.uni_shaper = (bcmolt_epon_oam_uni_shaper *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.uni_shaper.number_of_shapers * sizeof(bcmolt_epon_oam_uni_shaper));
                    }
                }

                for (i5 = 0; i5 < this->u.uni_shaper.number_of_shapers; i5++)
                {
                    if (!bcmolt_epon_oam_uni_shaper_unpack(&this->u.uni_shaper.uni_shaper[i5], &postLenBuf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EXT_FIRMWARE_VERSION:
            {
                if (!bcmolt_epon_oam_extended_load_label_unpack(&this->u.ext_firmware_version.version, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ENCRYPTION_KEY:
            {
                if (!bcmolt_epon_oam_direction_unpack(&this->u.encryption_key.direction, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.encryption_key.key_index))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.encryption_key.key_length))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.encryption_key.key_length > 0) && (this->u.encryption_key.key_data == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"key_data\" of struct \"bcmolt_epon_oam_tek_attribute_value_encryption_key\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.encryption_key.key_data = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.encryption_key.key_length * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.encryption_key.key_data, this->u.encryption_key.key_length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FILE_INFO:
            {
                if (!bcmolt_epon_oam_file_info_base_unpack(&this->u.file_info.file_info, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_SYSTEM_RULE_OPTIONS:
            {
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.system_rule_options.system_rule_options))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MTU:
            {
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.mtu.mtu))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_NVS_STATE:
            {
                if (!bcmolt_epon_oam_nvs_state_unpack(&this->u.nvs_state.state, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_QUEUEPRIMAP:
            {
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.queueprimap.priority_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.queueprimap.priority_count > 0) && (this->u.queueprimap.priority_map == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"priority_map\" of struct \"bcmolt_epon_oam_tek_attribute_value_queueprimap\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.queueprimap.priority_map = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.queueprimap.priority_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.queueprimap.priority_map, this->u.queueprimap.priority_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_DOWN_BIT_LOADING:
            {
                if (!bcmolt_epon_oam_oam_epoc_bit_loading_unpack(&this->u.epoc_down_bit_loading.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UP_BIT_LOADING:
            {
                if (!bcmolt_epon_oam_oam_epoc_bit_loading_unpack(&this->u.epoc_up_bit_loading.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_SDM_PHASE:
            {
                if (!bcmolt_epon_oam_oam_epoc_stat_unpack(&this->u.epoc_sdm_phase.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_SDM_AMPLITUDE:
            {
                if (!bcmolt_epon_oam_oam_epoc_stat_unpack(&this->u.epoc_sdm_amplitude.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_SDM_QUANTIZER:
            {
                if (!bcmolt_epon_oam_oam_epoc_stat_unpack(&this->u.epoc_sdm_quantizer.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UNUSED0:
            {
                if (!bcmolt_epon_oam_oam_epoc_stat_unpack(&this->u.epoc_unused0.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UNUSED1:
            {
                if (!bcmolt_epon_oam_oam_epoc_stat_unpack(&this->u.epoc_unused1.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UNUSED2:
            {
                if (!bcmolt_epon_oam_oam_epoc_stat_unpack(&this->u.epoc_unused2.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UNUSED3:
            {
                if (!bcmolt_epon_oam_oam_epoc_stat_unpack(&this->u.epoc_unused3.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UNUSED4:
            {
                if (!bcmolt_epon_oam_oam_epoc_stat_unpack(&this->u.epoc_unused4.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_QUEUE_CONFIG_V2:
            {
                if (!bcmolt_epon_oam_tek_queue_config_v2base_unpack(&this->u.queue_config_v2.queue_config, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FEATURE_SET:
            {
                if (!bcmolt_epon_oam_tek_feature_set_unpack(&this->u.feature_set.feature_set, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_PHY_TYPE:
            {
                if (!bcmolt_epon_oam_std_phy_type_unpack(&this->u.std_phy_type.value, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_SEQUENCE_NUMBER:
            {
                if (!bcmolt_epon_oam_tek_sequence_number_unpack(&this->u.sequence_number.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MPCP_CLOCK:
            {
                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.mpcp_clock.pulse_time))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MPCP_CLOCK_COMPENSATE:
            {
                if (!bcmolt_epon_oam_onu_clock_transport_config_unpack(&this->u.mpcp_clock_compensate.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MCAST_GLOBAL_CONFIG:
            {
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.mcast_global_config.robustness_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.mcast_global_config.lmq_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_bool(&postLenBuf, &this->u.mcast_global_config.fast_leave_enable))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_mcast_snoop_mode_unpack(&this->u.mcast_global_config.mode, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_ipmc_global_options_unpack(&this->u.mcast_global_config.options, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MCAST_DOMAIN_CONFIG:
            {
                if (!bcmolt_epon_oam_oam_mcast_domain_record_unpack(&this->u.mcast_domain_config.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ONU_HOLDOVER:
            {
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.onu_holdover.time))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_tek_holdover_flags_unpack(&this->u.onu_holdover.flags, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ALARM_THRESHOLD:
            {
                if (!bcmolt_epon_oam_tek_alarm_code_unpack(&this->u.alarm_threshold.alarm_code, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.alarm_threshold.raise_threshold))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.alarm_threshold.clear_threshold))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FAILSAFE:
            {
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.failsafe.count_of_failsafe_mech))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_bool(&postLenBuf, &this->u.failsafe.failsafe_state))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_STATS_THRESHOLD_INTERVAL:
            {
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.port_stats_threshold_interval.statistic_id))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.port_stats_threshold_interval.interval))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LINK_STATS_THRESHOLD_INTERVAL:
            {
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.link_stats_threshold_interval.statistic_id))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.link_stats_threshold_interval.interval))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_DUPLEX_STATUS:
            {
                if (!bcmolt_epon_oam_mac_duplex_status_unpack(&this->u.std_mac_duplex_status.status, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_ADMIN_STATE:
            {
                if (!bcmolt_epon_oam_autonegotiate_admin_state_unpack(&this->u.std_auto_neg_admin_state.state, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAU_MEDIA_AVAIL:
            {
                if (!bcmolt_epon_oam_mau_media_available_unpack(&this->u.std_mau_media_avail.status, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MDI_CROSSOVER:
            {
                if (!bcmolt_epon_oam_mdi_mode_unpack(&this->u.mdi_crossover.mode, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_ADDR:
            {
                if (!bcmolt_epon_oam_buf_read_mac_address(&postLenBuf, &this->u.std_mac_addr.address))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_BCAST_RATE_LIMIT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_BYPASS_SOFT_LEARN:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_CHIP_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_CHIP_VERSION:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_COS_TRANSLATION:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_CTL_VLAN_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DN_FILTER_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EGRESS_SHAPING:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EXTENDED_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FIRMWARE_VER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_IGMP_FRAME_RATE_LIMIT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_INGRESS_POLICING:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_IPMC_UNKNOWN_LEAVE_FWD:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_JEDEC_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LEARN_MODE_RULE_UPDATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LINK_STATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LUE_FIELD_SELECT_LIST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MCAST_GROUP_INFO:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_DYNAMIC_ENTRIES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_VLAN_MEMBERSHIP:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_VLAN_POLICY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PRI_ENQUEUING:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_SEARCH_CONFIG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STATIC_MAC_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_AD_SELECT_ABLE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_AD_TECH:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_AUTO_CFG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_LOCAL_SELECT_ABLE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_LOCAL_TECH:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_REMOTE_SIG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_RX_SELECT_ABLE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_RX_TECH:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_FEC_ABILITY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_FEC_CORRECTED_BLOCKS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_FEC_MODE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_FEC_UNCORRECTABLE_BLOCKS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CAPABILITIES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CARRIER_SENSE_ERR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_COLLISION_FRAMES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_FRAMES_RX:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_FRAMES_TX:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_FUNCS_SUPPORTED:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_PAUSE_DELAY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_UNSUPPORTED_OP_RX:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FR_EXCESSIVE_DEFERRAL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAMES_DEFERRED:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAMES_LOST_MAC_RX_ERR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAMES_LOST_MAC_TX_ERR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_MCAST_ADDR_LIST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_MCAST_RX_STATUS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_OUT_OF_RANGE_LEN_ERR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_PROMISCUOUS_STATUS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_TX_ENABLE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_DISCOVERY_TIMEOUT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_DISCOVERY_WINDOW_TX:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_RX_REG_ACK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_RX_REG_REQUEST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_RX_REPORT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_TX_GATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_TX_REGISTER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_PHY_ADMIN_STATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_PHY_TYPE_LIST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_UP_FILTER_TBL:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(buf, (this->width == 0) ? 0x0080 : this->width))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_attribute_value_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_tek_leaf_attribute leaf;
    bcmolt_epon_oam_buf postLenBuf;
    uint8_t length;
    if (!bcmolt_epon_oam_tek_leaf_attribute_unpack(&leaf, packed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
    {
        return BCMOS_FALSE;
    }

    if (length >= 0x0080)
    {
        return BCMOS_TRUE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
    switch (leaf)
    {
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LUE_FIELD_SELECT:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAMES_TX_OK:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_SINGLE_COLL_FRAMES:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_MULTIPLE_COLL_FRAMES:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAMES_RX_OK:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FCS_ERR:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_ALIGN_ERR:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_OCTETS_TX_OK:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_LATE_COLLISIONS:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_EXCESSIVE_COLLISIONS:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_OCTETS_RX_OK:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_MCAST_FRAMES_TX_OK:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_BCAST_FRAMES_TX_OK:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_MCAST_FRAMES_RX_OK:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_BCAST_FRAMES_RX_OK:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_IN_RANGE_LEN_ERR:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAME_TOO_LONG:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_ENABLE_STATUS:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_PHY_SYMBOL_ERR_DURING_CARRIER:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_PAUSE_TX:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_PAUSE_RX:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_OAM_LOCAL_ERR_FRAME_SECS_EVENT:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_OAM_EMUL_CRC8ERR:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_MAC_CTRL_FRAMES_TX:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_MAC_CTRL_FRAMES_RX:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_TX_REG_ACK:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_TX_REG_REQUEST:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_TX_REPORT:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_RX_GATE:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_RX_REGISTER:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DYN_LEARN_TBL_SIZE:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DYN_LEARN_AGE_LIMIT:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_UNICAST_FRAMES:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_UNICAST_FRAMES:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME_TOO_SHORT:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME64:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME65TO127:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME128TO255:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME256TO511:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME512TO1023:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME1024TO1518:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME1519PLUS:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME64:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME65TO127:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME128TO255:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME256TO511:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME512TO1023:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME1024TO1518:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME1519PLUS:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_DELAY_THRESHOLD:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_DELAY:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAMES_DROPPED:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_BYTES_DROPPED:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_BYTES_DELAYED:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_BYTES_UNUSED:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_DELAY_THRESHOLD:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_DELAY:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAMES_DROPPED:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_BYTES_DROPPED:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_BYTES_DELAYED:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_STAT_THRESHOLD:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LINK_STAT_THRESHOLD:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ENCRYPT_KEY_EXPIRY_TIME:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LEN_ERROR_DISCARD:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DYN_MAC_TBL:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_REPORT_THRESHOLDS:
            {
                uint32_t thresholds_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                    {
                        break;
                    }

                    thresholds_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(thresholds_elem_count * sizeof(uint16_t));
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_VLAN_ETHERTYPE:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_CAPABILITY:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    /*Optional unpack fails do not cause errors */
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_NEW_DN_FILTER_TBL:
            {
                uint32_t rules_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_tek_onu_rule_scan(&postLenBuf, extra_mem))
                    {
                        break;
                    }

                    rules_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(rules_elem_count * sizeof(bcmolt_epon_oam_tek_onu_rule));
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_NEW_UP_FILTER_TBL:
            {
                uint32_t rules_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_tek_onu_rule_scan(&postLenBuf, extra_mem))
                    {
                        break;
                    }

                    rules_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(rules_elem_count * sizeof(bcmolt_epon_oam_tek_onu_rule));
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ARP_REPLICATE_DEST:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LACP_DEST:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ONU_IGMP_VLAN:
            {
                uint8_t vlans_count;
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &vlans_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_tek_onu_igmp_vlan) * vlans_count);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, vlans_count * 5))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DYN_LEARNING_MODE:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MIN_MAC_LIMIT:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ONU_AGGREGATE_LIMIT:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_NVS_SCRATCHPAD:
            {
                uint32_t data_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                    {
                        break;
                    }

                    data_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(data_elem_count * sizeof(uint8_t));
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FLOOD_UNKNOWN:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LOCAL_SWITCHING:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DOWN_BURST_TOLL:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FEC_MODE:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POWER_MON_TEMPERATURE:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POWER_MON_VCC:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POWER_MON_TX_BIAS:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POWER_MON_TX_POWER:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POWER_MON_RX_POWER:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_NETWORK_PON_MAP:
            {
                uint8_t network_epon_ports_count;
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &network_epon_ports_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * network_epon_ports_count);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, network_epon_ports_count * 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PSSTATE:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_SLE_MODE:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LEARN_TABLE_MODE:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TRANSCEIVER_SIGNAL_DETECT:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_CROSSBAR_CONFIG:
            {
                uint8_t user_port_to_network_port_count;
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &user_port_to_network_port_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * user_port_to_network_port_count);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, user_port_to_network_port_count * 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TRANSCEIVER_BURST_ACTIVITY:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_CONTROL_PORT:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_VLAN_DESTINATIONS:
            {
                uint8_t mappings_count;
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &mappings_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_tek_vlan_destination_mapping) * mappings_count);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, mappings_count * 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ENCRYPTION_MODE:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_INTERNAL_VERSION:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FIRMWARE_TIMESTAMP:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 7))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ONU_RULE:
            {
                if (!bcmolt_epon_oam_tek_attribute_value_rule_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POLICER:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_UNI_SHAPER:
            {
                uint8_t number_of_shapers;
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &number_of_shapers))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_uni_shaper) * number_of_shapers);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, number_of_shapers * 10))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EXT_FIRMWARE_VERSION:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 5))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ENCRYPTION_KEY:
            {
                uint8_t key_length;
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &key_length))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * key_length);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, key_length * 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FILE_INFO:
            {
                if (!bcmolt_epon_oam_file_info_base_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_SYSTEM_RULE_OPTIONS:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MTU:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_NVS_STATE:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_QUEUEPRIMAP:
            {
                uint8_t priority_count;
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &priority_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * priority_count);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, priority_count * 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_DOWN_BIT_LOADING:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 64))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UP_BIT_LOADING:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 64))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_SDM_PHASE:
            {
                if (!bcmolt_epon_oam_oam_epoc_stat_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_SDM_AMPLITUDE:
            {
                if (!bcmolt_epon_oam_oam_epoc_stat_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_SDM_QUANTIZER:
            {
                if (!bcmolt_epon_oam_oam_epoc_stat_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UNUSED0:
            {
                if (!bcmolt_epon_oam_oam_epoc_stat_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UNUSED1:
            {
                if (!bcmolt_epon_oam_oam_epoc_stat_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UNUSED2:
            {
                if (!bcmolt_epon_oam_oam_epoc_stat_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UNUSED3:
            {
                if (!bcmolt_epon_oam_oam_epoc_stat_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UNUSED4:
            {
                if (!bcmolt_epon_oam_oam_epoc_stat_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_QUEUE_CONFIG_V2:
            {
                if (!bcmolt_epon_oam_tek_queue_config_v2base_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FEATURE_SET:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_PHY_TYPE:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_SEQUENCE_NUMBER:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MPCP_CLOCK:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MPCP_CLOCK_COMPENSATE:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 16))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MCAST_GLOBAL_CONFIG:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MCAST_DOMAIN_CONFIG:
            {
                if (!bcmolt_epon_oam_oam_mcast_domain_record_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ONU_HOLDOVER:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ALARM_THRESHOLD:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FAILSAFE:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_STATS_THRESHOLD_INTERVAL:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LINK_STATS_THRESHOLD_INTERVAL:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_DUPLEX_STATUS:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_ADMIN_STATE:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAU_MEDIA_AVAIL:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MDI_CROSSOVER:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_ADDR:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 6))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_BCAST_RATE_LIMIT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_BYPASS_SOFT_LEARN:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_CHIP_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_CHIP_VERSION:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_COS_TRANSLATION:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_CTL_VLAN_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DN_FILTER_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EGRESS_SHAPING:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EXTENDED_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FIRMWARE_VER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_IGMP_FRAME_RATE_LIMIT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_INGRESS_POLICING:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_IPMC_UNKNOWN_LEAVE_FWD:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_JEDEC_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LEARN_MODE_RULE_UPDATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LINK_STATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LUE_FIELD_SELECT_LIST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MCAST_GROUP_INFO:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_DYNAMIC_ENTRIES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_VLAN_MEMBERSHIP:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_VLAN_POLICY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PRI_ENQUEUING:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_SEARCH_CONFIG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STATIC_MAC_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_AD_SELECT_ABLE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_AD_TECH:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_AUTO_CFG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_LOCAL_SELECT_ABLE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_LOCAL_TECH:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_REMOTE_SIG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_RX_SELECT_ABLE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_RX_TECH:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_FEC_ABILITY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_FEC_CORRECTED_BLOCKS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_FEC_MODE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_FEC_UNCORRECTABLE_BLOCKS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CAPABILITIES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CARRIER_SENSE_ERR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_COLLISION_FRAMES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_FRAMES_RX:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_FRAMES_TX:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_FUNCS_SUPPORTED:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_PAUSE_DELAY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_UNSUPPORTED_OP_RX:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FR_EXCESSIVE_DEFERRAL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAMES_DEFERRED:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAMES_LOST_MAC_RX_ERR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAMES_LOST_MAC_TX_ERR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_MCAST_ADDR_LIST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_MCAST_RX_STATUS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_OUT_OF_RANGE_LEN_ERR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_PROMISCUOUS_STATUS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_TX_ENABLE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_DISCOVERY_TIMEOUT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_DISCOVERY_WINDOW_TX:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_RX_REG_ACK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_RX_REG_REQUEST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_RX_REPORT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_TX_GATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_TX_REGISTER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_PHY_ADMIN_STATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_PHY_TYPE_LIST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_UP_FILTER_TBL:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tek_attribute_value_report_thresholds_count_thresholds(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 2);
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tek_attribute_value_new_dn_filter_tbl_count_rules(bcmolt_epon_oam_buf *buf)
{
    uint32_t count = 0;
    uint32_t dummy = 0;
    bcmolt_epon_oam_buf bufClone = *buf;
    while (BCMOS_TRUE)
    {
        if (!bcmolt_epon_oam_tek_onu_rule_scan(&bufClone, &dummy))
        {
            break;
        }

        count += 1;
    }

    return count;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tek_attribute_value_new_up_filter_tbl_count_rules(bcmolt_epon_oam_buf *buf)
{
    uint32_t count = 0;
    uint32_t dummy = 0;
    bcmolt_epon_oam_buf bufClone = *buf;
    while (BCMOS_TRUE)
    {
        if (!bcmolt_epon_oam_tek_onu_rule_scan(&bufClone, &dummy))
        {
            break;
        }

        count += 1;
    }

    return count;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tek_attribute_value_nvs_scratchpad_count_data(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_onu_queue_config_pack(bcmolt_epon_oam_tek_onu_queue_config *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u8(buf, this->queue_sizes_count))
    {
        return BCMOS_FALSE;
    }

    if ((this->queue_sizes_count > 0) && (this->queue_sizes == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"queue_sizes\" of struct \"bcmolt_epon_oam_tek_onu_queue_config\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write(buf, this->queue_sizes, this->queue_sizes_count))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tek_onu_queue_config_get_packed_length(bcmolt_epon_oam_tek_onu_queue_config *this)
{
    return 1 + this->queue_sizes_count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_onu_queue_config_unpack(bcmolt_epon_oam_tek_onu_queue_config *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->queue_sizes_count))
    {
        return BCMOS_FALSE;
    }

    if ((this->queue_sizes_count > 0) && (this->queue_sizes == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"queue_sizes\" of struct \"bcmolt_epon_oam_tek_onu_queue_config\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->queue_sizes = (uint8_t *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->queue_sizes_count * sizeof(uint8_t));
        }
    }

    if (!bcmolt_epon_oam_buf_read(buf, this->queue_sizes, this->queue_sizes_count))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_onu_queue_config_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    uint8_t queue_sizes_count;
    if (!bcmolt_epon_oam_buf_read_u8(packed, &queue_sizes_count))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * queue_sizes_count);
    if (!bcmolt_epon_oam_buf_skip(packed, queue_sizes_count * 1))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_igmp_snooping_port_config_pack(bcmolt_epon_oam_tek_igmp_snooping_port_config *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u8(buf, this->number_of_igmp_groups))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->relative_queue_for_classification))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_igmp_snooping_port_config_unpack(bcmolt_epon_oam_tek_igmp_snooping_port_config *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->number_of_igmp_groups))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->relative_queue_for_classification))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_igmp_snooping_port_config_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 2);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_onu_igmp_group_no_vid_pack(bcmolt_epon_oam_tek_onu_igmp_group_no_vid *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_ipv4_address(buf, this->group))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->ports))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_onu_igmp_group_no_vid_unpack(bcmolt_epon_oam_tek_onu_igmp_group_no_vid *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_ipv4_address(buf, &this->group))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->ports))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_onu_igmp_group_no_vid_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 5);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_action_value_base_pack(bcmolt_epon_oam_tek_action_value_base *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t preLenFieldPos;
    uint32_t bytesAfterLenField;
    if (!bcmolt_epon_oam_tek_leaf_action_pack(this->leaf, buf))
    {
        return BCMOS_FALSE;
    }

    if (this->width >= 0x0080)
    {
        bcmolt_epon_oam_buf_write_u8(buf, this->width);
        return BCMOS_TRUE;
    }

    preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

    /* skip over length field (we'll fill it in later) */
    if (!bcmolt_epon_oam_buf_skip(buf, 1))
    {
        return BCMOS_FALSE;
    }

    switch (this->leaf)
    {
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ADD_STATIC_ENTRY:
            {
                if (!bcmolt_epon_oam_buf_write_mac_address(buf, this->u.add_static_entry.mac))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DEL_STATIC_ENTRY:
            {
                if (!bcmolt_epon_oam_buf_write_mac_address(buf, this->u.del_static_entry.mac))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ADD_RULE:
            {
                uint32_t i0;
                if ((this->u.add_rule.rules_count > 0) && (this->u.add_rule.rules == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"rules\" of struct \"bcmolt_epon_oam_tek_action_value_base_add_rule\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i0 = 0; i0 < this->u.add_rule.rules_count; i0++)
                {
                    if (!bcmolt_epon_oam_tek_onu_rule_pack(&this->u.add_rule.rules[i0], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_NEW_ADD_RULE:
            {
                if (!bcmolt_epon_oam_tek_onu_rule_pack(&this->u.new_add_rule.rules, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_NEW_DEL_RULE:
            {
                uint32_t i1;
                if ((this->u.new_del_rule.rules_count > 0) && (this->u.new_del_rule.rules == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"rules\" of struct \"bcmolt_epon_oam_tek_action_value_base_new_del_rule\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i1 = 0; i1 < this->u.new_del_rule.rules_count; i1++)
                {
                    if (!bcmolt_epon_oam_tek_onu_rule_pack(&this->u.new_del_rule.rules[i1], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DELETE_RULE:
            {
                uint32_t i2;
                if ((this->u.delete_rule.rules_count > 0) && (this->u.delete_rule.rules == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"rules\" of struct \"bcmolt_epon_oam_tek_action_value_base_delete_rule\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i2 = 0; i2 < this->u.delete_rule.rules_count; i2++)
                {
                    if (!bcmolt_epon_oam_tek_onu_rule_pack(&this->u.delete_rule.rules[i2], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_RESET_ONU:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_STATS:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_GPIO_CONFIG:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_GPIO_CONFIG:
            {
                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.set_gpio_config.gpio_config))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_QUEUE_CONFIG:
            {
                uint8_t i3;
                uint8_t i4;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.set_queue_config.links_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.set_queue_config.links_count > 0) && (this->u.set_queue_config.links == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"links\" of struct \"bcmolt_epon_oam_tek_action_value_base_set_queue_config\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i3 = 0; i3 < this->u.set_queue_config.links_count; i3++)
                {
                    if (!bcmolt_epon_oam_tek_onu_queue_config_pack(&this->u.set_queue_config.links[i3], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.set_queue_config.ports_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.set_queue_config.ports_count > 0) && (this->u.set_queue_config.ports == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"ports\" of struct \"bcmolt_epon_oam_tek_action_value_base_set_queue_config\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i4 = 0; i4 < this->u.set_queue_config.ports_count; i4++)
                {
                    if (!bcmolt_epon_oam_tek_onu_queue_config_pack(&this->u.set_queue_config.ports[i4], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }

                if (!bcmolt_epon_oam_tek_onu_queue_config_pack(&this->u.set_queue_config.multicast, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_QUEUE_CONFIG:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ERASE_NVS:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_IGMP_CONFIG:
            {
                uint8_t i5;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.set_igmp_config.robustness_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.set_igmp_config.last_member_query_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.set_igmp_config.ports_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.set_igmp_config.ports_count > 0) && (this->u.set_igmp_config.ports == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"ports\" of struct \"bcmolt_epon_oam_tek_action_value_base_set_igmp_config\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i5 = 0; i5 < this->u.set_igmp_config.ports_count; i5++)
                {
                    if (!bcmolt_epon_oam_tek_igmp_snooping_port_config_pack(&this->u.set_igmp_config.ports[i5], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }

                if (!bcmolt_epon_oam_tek_igmp_forwarding_qualifer_pack(this->u.set_igmp_config.grp_forward, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_tek_igmp_snooping_options_pack(this->u.set_igmp_config.options, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_IGMP_CONFIG:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_IGMP_GROUP_INFO:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ADD_IGMP_GROUP:
            {
                uint8_t i6;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.add_igmp_group.groups_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.add_igmp_group.groups_count > 0) && (this->u.add_igmp_group.groups == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"groups\" of struct \"bcmolt_epon_oam_tek_action_value_base_add_igmp_group\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i6 = 0; i6 < this->u.add_igmp_group.groups_count; i6++)
                {
                    if (!bcmolt_epon_oam_tek_onu_igmp_group_no_vid_pack(&this->u.add_igmp_group.groups[i6], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_OAM_RATE:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_OAM_RATE:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.set_oam_rate.max_oam_rate))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.set_oam_rate.min_oam_rate))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_LOAD_INFO:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_BC_LASER_POWER_OFF:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.bc_laser_power_off.off_time))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SLEEP:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.sleep.time))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_sleep_options_pack(this->u.sleep.options, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ADD_LUE_RULE:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DEL_LUE_RULE:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ENABLE_POLICER:
            {
                if (!bcmolt_epon_oam_flow_direction_pack(this->u.enable_policer.direction, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.enable_policer.policer_id))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.enable_policer.burst_size))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.enable_policer.traffic_rate))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DISABLE_POLICER:
            {
                if (!bcmolt_epon_oam_flow_direction_pack(this->u.disable_policer.direction, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.disable_policer.policer_id))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_EPOC_SDM_STATS:
            {
                if (!bcmolt_epon_oam_epoc_stat_gather_modes_pack(this->u.get_epoc_sdm_stats.mode, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_epoc_sdm250stat_index_pack(this->u.get_epoc_sdm_stats.stat_index, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_EPOC_CMC_STATS:
            {
                if (!bcmolt_epon_oam_epoc_stat_gather_modes_pack(this->u.get_epoc_cmc_stats.mode, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_epoc_cmc_stat_index_pack(this->u.get_epoc_cmc_stats.stat_index, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_EPOC_CNU_STATS:
            {
                if (!bcmolt_epon_oam_epoc_stat_gather_modes_pack(this->u.get_epoc_cnu_stats.mode, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_epoc_cnu_stat_index_pack(this->u.get_epoc_cnu_stats.stat_index, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_DN_BCAST_QUEUE:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.set_dn_bcast_queue.port_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.set_dn_bcast_queue.port_count > 0) && (this->u.set_dn_bcast_queue.queue_per_port == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"queue_per_port\" of struct \"bcmolt_epon_oam_tek_action_value_base_set_dn_bcast_queue\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.set_dn_bcast_queue.queue_per_port, this->u.set_dn_bcast_queue.port_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_DN_BCAST_QUEUE:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_DN_FILTER_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_DN_USER_RULES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_DYN_LEARN_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_LUE_RULE_TABLE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_UP_FILTER_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_UP_USER_RULES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLR_DN_CLASS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLR_UP_CLASS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DEL_IGMP_GROUP:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DELETE_MCAST_DOMAIN_CONFIG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DELETE_MCAST_GROUP:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_EPOC_UNUSED0:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_EPOC_UNUSED1:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_FIND_LUE_RULE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_GPIO_VALUE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_LUE_FIELD:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_MDIO:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_PHY_ADDR_MDIO:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_PORT_RATE_CONTROL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_QUEUE_RATE_CONTROL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_LASER_TX_POWER_OFF:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_LOOPBACK_DISABLE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_LOOPBACK_ENABLE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ONU_DISABLE_USER_TRAFFIC:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ONU_ENABLE_USER_TRAFFIC:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_PROTECTION_SWITCH:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_GPIO_VALUE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_LUE_FIELD:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_MDIO:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_PHY_ADDR_MDIO:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_PORT_RATE_CONTROL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_QUEUE_RATE_CONTROL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_AUTO_ADMIN_CTRL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_AUTO_RENEGOTIATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAC_ADD_GROUP_ADDR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAC_DEL_GROUP_ADDR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAC_INIT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAC_SELF_TEST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAU_ADMIN_CTRL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAU_RESET:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_PHY_ADMIN_CONTROL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_PORT_ADMIN_CTRL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_RPT_IN_SERVICE_TEST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_RPT_RESET:
        default:
            {
            }
            break;
    }

    bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
    if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tek_action_value_base_get_packed_length(bcmolt_epon_oam_tek_action_value_base *this)
{
    if (this->width >= 0x0080)
    {
        return this->width;
    }
    else
    {
        uint32_t count = 3;
        switch (this->leaf)
        {
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ADD_STATIC_ENTRY:
                {
                    count += 6;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DEL_STATIC_ENTRY:
                {
                    count += 6;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ADD_RULE:
                {
                    uint32_t i0;
                    if ((this->u.add_rule.rules_count > 0) && (this->u.add_rule.rules == NULL))
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"rules_count\" of struct \"bcmolt_epon_oam_tek_action_value_base\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return 0;
                    }

                    for (i0 = 0; i0 < this->u.add_rule.rules_count; i0++)
                    {
                        count += bcmolt_epon_oam_tek_onu_rule_get_packed_length(&this->u.add_rule.rules[i0]);
                    }
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_NEW_ADD_RULE:
                {
                    count += bcmolt_epon_oam_tek_onu_rule_get_packed_length(&this->u.new_add_rule.rules);
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_NEW_DEL_RULE:
                {
                    uint32_t i1;
                    if ((this->u.new_del_rule.rules_count > 0) && (this->u.new_del_rule.rules == NULL))
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"rules_count\" of struct \"bcmolt_epon_oam_tek_action_value_base\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return 0;
                    }

                    for (i1 = 0; i1 < this->u.new_del_rule.rules_count; i1++)
                    {
                        count += bcmolt_epon_oam_tek_onu_rule_get_packed_length(&this->u.new_del_rule.rules[i1]);
                    }
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DELETE_RULE:
                {
                    uint32_t i2;
                    if ((this->u.delete_rule.rules_count > 0) && (this->u.delete_rule.rules == NULL))
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"rules_count\" of struct \"bcmolt_epon_oam_tek_action_value_base\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return 0;
                    }

                    for (i2 = 0; i2 < this->u.delete_rule.rules_count; i2++)
                    {
                        count += bcmolt_epon_oam_tek_onu_rule_get_packed_length(&this->u.delete_rule.rules[i2]);
                    }
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_RESET_ONU:
                {
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_STATS:
                {
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_GPIO_CONFIG:
                {
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_GPIO_CONFIG:
                {
                    count += 4;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_QUEUE_CONFIG:
                {
                    uint32_t i3;
                    uint32_t i4;
                    count += 2 + bcmolt_epon_oam_tek_onu_queue_config_get_packed_length(&this->u.set_queue_config.multicast);
                    if ((this->u.set_queue_config.links_count > 0) && (this->u.set_queue_config.links == NULL))
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"links_count\" of struct \"bcmolt_epon_oam_tek_action_value_base\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return 0;
                    }

                    for (i3 = 0; i3 < this->u.set_queue_config.links_count; i3++)
                    {
                        count += bcmolt_epon_oam_tek_onu_queue_config_get_packed_length(&this->u.set_queue_config.links[i3]);
                    }

                    if ((this->u.set_queue_config.ports_count > 0) && (this->u.set_queue_config.ports == NULL))
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"ports_count\" of struct \"bcmolt_epon_oam_tek_action_value_base\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return 0;
                    }

                    for (i4 = 0; i4 < this->u.set_queue_config.ports_count; i4++)
                    {
                        count += bcmolt_epon_oam_tek_onu_queue_config_get_packed_length(&this->u.set_queue_config.ports[i4]);
                    }
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_QUEUE_CONFIG:
                {
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ERASE_NVS:
                {
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_IGMP_CONFIG:
                {
                    count += 6 + (2 * this->u.set_igmp_config.ports_count);
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_IGMP_CONFIG:
                {
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_IGMP_GROUP_INFO:
                {
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ADD_IGMP_GROUP:
                {
                    count += 1 + (5 * this->u.add_igmp_group.groups_count);
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_OAM_RATE:
                {
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_OAM_RATE:
                {
                    count += 2;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_LOAD_INFO:
                {
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_BC_LASER_POWER_OFF:
                {
                    count += 2;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SLEEP:
                {
                    count += 6;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ADD_LUE_RULE:
                {
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DEL_LUE_RULE:
                {
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ENABLE_POLICER:
                {
                    count += 10;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DISABLE_POLICER:
                {
                    count += 2;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_EPOC_SDM_STATS:
                {
                    count += 2;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_EPOC_CMC_STATS:
                {
                    count += 2;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_EPOC_CNU_STATS:
                {
                    count += 2;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_DN_BCAST_QUEUE:
                {
                    count += 1 + this->u.set_dn_bcast_queue.port_count;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_DN_BCAST_QUEUE:
                {
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_DN_FILTER_TBL:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_DN_USER_RULES:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_DYN_LEARN_TBL:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_LUE_RULE_TABLE:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_UP_FILTER_TBL:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_UP_USER_RULES:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLR_DN_CLASS:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLR_UP_CLASS:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DEL_IGMP_GROUP:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DELETE_MCAST_DOMAIN_CONFIG:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DELETE_MCAST_GROUP:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_EPOC_UNUSED0:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_EPOC_UNUSED1:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_FIND_LUE_RULE:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_GPIO_VALUE:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_LUE_FIELD:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_MDIO:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_PHY_ADDR_MDIO:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_PORT_RATE_CONTROL:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_QUEUE_RATE_CONTROL:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_LASER_TX_POWER_OFF:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_LOOPBACK_DISABLE:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_LOOPBACK_ENABLE:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ONU_DISABLE_USER_TRAFFIC:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ONU_ENABLE_USER_TRAFFIC:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_PROTECTION_SWITCH:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_GPIO_VALUE:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_LUE_FIELD:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_MDIO:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_PHY_ADDR_MDIO:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_PORT_RATE_CONTROL:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_QUEUE_RATE_CONTROL:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_AUTO_ADMIN_CTRL:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_AUTO_RENEGOTIATE:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAC_ADD_GROUP_ADDR:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAC_DEL_GROUP_ADDR:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAC_INIT:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAC_SELF_TEST:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAU_ADMIN_CTRL:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAU_RESET:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_PHY_ADMIN_CONTROL:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_PORT_ADMIN_CTRL:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_RPT_IN_SERVICE_TEST:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_RPT_RESET:
            default:
                {
                }
                break;
        }

        return count;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_action_value_base_unpack(bcmolt_epon_oam_tek_action_value_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    bcmolt_epon_oam_buf postLenBuf;
    if (!bcmolt_epon_oam_tek_leaf_action_unpack(&this->leaf, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->width))
    {
        return BCMOS_FALSE;
    }

    if (this->width >= 0x0080)
    {
        return BCMOS_TRUE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, (this->width == 0) ? 0x0080 : this->width, buf->curr);
    switch (this->leaf)
    {
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ADD_STATIC_ENTRY:
            {
                if (!bcmolt_epon_oam_buf_read_mac_address(&postLenBuf, &this->u.add_static_entry.mac))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DEL_STATIC_ENTRY:
            {
                if (!bcmolt_epon_oam_buf_read_mac_address(&postLenBuf, &this->u.del_static_entry.mac))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ADD_RULE:
            {
                uint32_t i0;
                this->u.add_rule.rules_count = bcmolt_epon_oam_tek_action_value_base_add_rule_count_rules(&postLenBuf);
                if ((this->u.add_rule.rules_count > 0) && (this->u.add_rule.rules == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"rules\" of struct \"bcmolt_epon_oam_tek_action_value_base_add_rule\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.add_rule.rules = (bcmolt_epon_oam_tek_onu_rule *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.add_rule.rules_count * sizeof(bcmolt_epon_oam_tek_onu_rule));
                    }
                }

                for (i0 = 0; i0 < this->u.add_rule.rules_count; i0++)
                {
                    if (!bcmolt_epon_oam_tek_onu_rule_unpack(&this->u.add_rule.rules[i0], &postLenBuf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_NEW_ADD_RULE:
            {
                if (!bcmolt_epon_oam_tek_onu_rule_unpack(&this->u.new_add_rule.rules, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_NEW_DEL_RULE:
            {
                uint32_t i1;
                this->u.new_del_rule.rules_count = bcmolt_epon_oam_tek_action_value_base_new_del_rule_count_rules(&postLenBuf);
                if ((this->u.new_del_rule.rules_count > 0) && (this->u.new_del_rule.rules == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"rules\" of struct \"bcmolt_epon_oam_tek_action_value_base_new_del_rule\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.new_del_rule.rules = (bcmolt_epon_oam_tek_onu_rule *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.new_del_rule.rules_count * sizeof(bcmolt_epon_oam_tek_onu_rule));
                    }
                }

                for (i1 = 0; i1 < this->u.new_del_rule.rules_count; i1++)
                {
                    if (!bcmolt_epon_oam_tek_onu_rule_unpack(&this->u.new_del_rule.rules[i1], &postLenBuf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DELETE_RULE:
            {
                uint32_t i2;
                this->u.delete_rule.rules_count = bcmolt_epon_oam_tek_action_value_base_delete_rule_count_rules(&postLenBuf);
                if ((this->u.delete_rule.rules_count > 0) && (this->u.delete_rule.rules == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"rules\" of struct \"bcmolt_epon_oam_tek_action_value_base_delete_rule\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.delete_rule.rules = (bcmolt_epon_oam_tek_onu_rule *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.delete_rule.rules_count * sizeof(bcmolt_epon_oam_tek_onu_rule));
                    }
                }

                for (i2 = 0; i2 < this->u.delete_rule.rules_count; i2++)
                {
                    if (!bcmolt_epon_oam_tek_onu_rule_unpack(&this->u.delete_rule.rules[i2], &postLenBuf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_RESET_ONU:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_STATS:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_GPIO_CONFIG:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_GPIO_CONFIG:
            {
                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.set_gpio_config.gpio_config))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_QUEUE_CONFIG:
            {
                uint8_t i3;
                uint8_t i4;
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.set_queue_config.links_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.set_queue_config.links_count > 0) && (this->u.set_queue_config.links == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"links\" of struct \"bcmolt_epon_oam_tek_action_value_base_set_queue_config\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.set_queue_config.links = (bcmolt_epon_oam_tek_onu_queue_config *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.set_queue_config.links_count * sizeof(bcmolt_epon_oam_tek_onu_queue_config));
                    }
                }

                for (i3 = 0; i3 < this->u.set_queue_config.links_count; i3++)
                {
                    if (!bcmolt_epon_oam_tek_onu_queue_config_unpack(&this->u.set_queue_config.links[i3], &postLenBuf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.set_queue_config.ports_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.set_queue_config.ports_count > 0) && (this->u.set_queue_config.ports == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"ports\" of struct \"bcmolt_epon_oam_tek_action_value_base_set_queue_config\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.set_queue_config.ports = (bcmolt_epon_oam_tek_onu_queue_config *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.set_queue_config.ports_count * sizeof(bcmolt_epon_oam_tek_onu_queue_config));
                    }
                }

                for (i4 = 0; i4 < this->u.set_queue_config.ports_count; i4++)
                {
                    if (!bcmolt_epon_oam_tek_onu_queue_config_unpack(&this->u.set_queue_config.ports[i4], &postLenBuf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }

                if (!bcmolt_epon_oam_tek_onu_queue_config_unpack(&this->u.set_queue_config.multicast, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_QUEUE_CONFIG:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ERASE_NVS:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_IGMP_CONFIG:
            {
                uint8_t i5;
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.set_igmp_config.robustness_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.set_igmp_config.last_member_query_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.set_igmp_config.ports_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.set_igmp_config.ports_count > 0) && (this->u.set_igmp_config.ports == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"ports\" of struct \"bcmolt_epon_oam_tek_action_value_base_set_igmp_config\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.set_igmp_config.ports = (bcmolt_epon_oam_tek_igmp_snooping_port_config *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.set_igmp_config.ports_count * sizeof(bcmolt_epon_oam_tek_igmp_snooping_port_config));
                    }
                }

                for (i5 = 0; i5 < this->u.set_igmp_config.ports_count; i5++)
                {
                    if (!bcmolt_epon_oam_tek_igmp_snooping_port_config_unpack(&this->u.set_igmp_config.ports[i5], &postLenBuf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }

                if (!bcmolt_epon_oam_tek_igmp_forwarding_qualifer_unpack(&this->u.set_igmp_config.grp_forward, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_tek_igmp_snooping_options_unpack(&this->u.set_igmp_config.options, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_IGMP_CONFIG:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_IGMP_GROUP_INFO:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ADD_IGMP_GROUP:
            {
                uint8_t i6;
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.add_igmp_group.groups_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.add_igmp_group.groups_count > 0) && (this->u.add_igmp_group.groups == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"groups\" of struct \"bcmolt_epon_oam_tek_action_value_base_add_igmp_group\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.add_igmp_group.groups = (bcmolt_epon_oam_tek_onu_igmp_group_no_vid *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.add_igmp_group.groups_count * sizeof(bcmolt_epon_oam_tek_onu_igmp_group_no_vid));
                    }
                }

                for (i6 = 0; i6 < this->u.add_igmp_group.groups_count; i6++)
                {
                    if (!bcmolt_epon_oam_tek_onu_igmp_group_no_vid_unpack(&this->u.add_igmp_group.groups[i6], &postLenBuf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_OAM_RATE:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_OAM_RATE:
            {
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.set_oam_rate.max_oam_rate))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.set_oam_rate.min_oam_rate))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_LOAD_INFO:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_BC_LASER_POWER_OFF:
            {
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.bc_laser_power_off.off_time))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SLEEP:
            {
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.sleep.time))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_sleep_options_unpack(&this->u.sleep.options, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ADD_LUE_RULE:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DEL_LUE_RULE:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ENABLE_POLICER:
            {
                if (!bcmolt_epon_oam_flow_direction_unpack(&this->u.enable_policer.direction, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.enable_policer.policer_id))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.enable_policer.burst_size))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.enable_policer.traffic_rate))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DISABLE_POLICER:
            {
                if (!bcmolt_epon_oam_flow_direction_unpack(&this->u.disable_policer.direction, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.disable_policer.policer_id))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_EPOC_SDM_STATS:
            {
                if (!bcmolt_epon_oam_epoc_stat_gather_modes_unpack(&this->u.get_epoc_sdm_stats.mode, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_epoc_sdm250stat_index_unpack(&this->u.get_epoc_sdm_stats.stat_index, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_EPOC_CMC_STATS:
            {
                if (!bcmolt_epon_oam_epoc_stat_gather_modes_unpack(&this->u.get_epoc_cmc_stats.mode, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_epoc_cmc_stat_index_unpack(&this->u.get_epoc_cmc_stats.stat_index, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_EPOC_CNU_STATS:
            {
                if (!bcmolt_epon_oam_epoc_stat_gather_modes_unpack(&this->u.get_epoc_cnu_stats.mode, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_epoc_cnu_stat_index_unpack(&this->u.get_epoc_cnu_stats.stat_index, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_DN_BCAST_QUEUE:
            {
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.set_dn_bcast_queue.port_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.set_dn_bcast_queue.port_count > 0) && (this->u.set_dn_bcast_queue.queue_per_port == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"queue_per_port\" of struct \"bcmolt_epon_oam_tek_action_value_base_set_dn_bcast_queue\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.set_dn_bcast_queue.queue_per_port = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.set_dn_bcast_queue.port_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.set_dn_bcast_queue.queue_per_port, this->u.set_dn_bcast_queue.port_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_DN_BCAST_QUEUE:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_DN_FILTER_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_DN_USER_RULES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_DYN_LEARN_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_LUE_RULE_TABLE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_UP_FILTER_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_UP_USER_RULES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLR_DN_CLASS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLR_UP_CLASS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DEL_IGMP_GROUP:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DELETE_MCAST_DOMAIN_CONFIG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DELETE_MCAST_GROUP:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_EPOC_UNUSED0:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_EPOC_UNUSED1:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_FIND_LUE_RULE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_GPIO_VALUE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_LUE_FIELD:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_MDIO:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_PHY_ADDR_MDIO:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_PORT_RATE_CONTROL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_QUEUE_RATE_CONTROL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_LASER_TX_POWER_OFF:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_LOOPBACK_DISABLE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_LOOPBACK_ENABLE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ONU_DISABLE_USER_TRAFFIC:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ONU_ENABLE_USER_TRAFFIC:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_PROTECTION_SWITCH:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_GPIO_VALUE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_LUE_FIELD:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_MDIO:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_PHY_ADDR_MDIO:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_PORT_RATE_CONTROL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_QUEUE_RATE_CONTROL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_AUTO_ADMIN_CTRL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_AUTO_RENEGOTIATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAC_ADD_GROUP_ADDR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAC_DEL_GROUP_ADDR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAC_INIT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAC_SELF_TEST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAU_ADMIN_CTRL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAU_RESET:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_PHY_ADMIN_CONTROL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_PORT_ADMIN_CTRL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_RPT_IN_SERVICE_TEST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_RPT_RESET:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(buf, (this->width == 0) ? 0x0080 : this->width))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_action_value_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_tek_leaf_action leaf;
    bcmolt_epon_oam_buf postLenBuf;
    uint8_t length;
    if (!bcmolt_epon_oam_tek_leaf_action_unpack(&leaf, packed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
    {
        return BCMOS_FALSE;
    }

    if (length >= 0x0080)
    {
        return BCMOS_TRUE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
    switch (leaf)
    {
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ADD_STATIC_ENTRY:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 6))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DEL_STATIC_ENTRY:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 6))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ADD_RULE:
            {
                uint32_t rules_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_tek_onu_rule_scan(&postLenBuf, extra_mem))
                    {
                        break;
                    }

                    rules_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(rules_elem_count * sizeof(bcmolt_epon_oam_tek_onu_rule));
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_NEW_ADD_RULE:
            {
                if (!bcmolt_epon_oam_tek_onu_rule_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_NEW_DEL_RULE:
            {
                uint32_t rules_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_tek_onu_rule_scan(&postLenBuf, extra_mem))
                    {
                        break;
                    }

                    rules_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(rules_elem_count * sizeof(bcmolt_epon_oam_tek_onu_rule));
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DELETE_RULE:
            {
                uint32_t rules_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_tek_onu_rule_scan(&postLenBuf, extra_mem))
                    {
                        break;
                    }

                    rules_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(rules_elem_count * sizeof(bcmolt_epon_oam_tek_onu_rule));
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_RESET_ONU:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_STATS:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_GPIO_CONFIG:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_GPIO_CONFIG:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_QUEUE_CONFIG:
            {
                uint8_t links_count;
                uint8_t i0;
                uint8_t ports_count;
                uint8_t i1;
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &links_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_tek_onu_queue_config) * links_count);
                for (i0 = 0; i0 < links_count; i0++)
                {
                    if (!bcmolt_epon_oam_tek_onu_queue_config_scan(&postLenBuf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &ports_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_tek_onu_queue_config) * ports_count);
                for (i1 = 0; i1 < ports_count; i1++)
                {
                    if (!bcmolt_epon_oam_tek_onu_queue_config_scan(&postLenBuf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }

                if (!bcmolt_epon_oam_tek_onu_queue_config_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_QUEUE_CONFIG:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ERASE_NVS:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_IGMP_CONFIG:
            {
                uint8_t ports_count;
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &ports_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_tek_igmp_snooping_port_config) * ports_count);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, ports_count * 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_IGMP_CONFIG:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_IGMP_GROUP_INFO:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ADD_IGMP_GROUP:
            {
                uint8_t groups_count;
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &groups_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_tek_onu_igmp_group_no_vid) * groups_count);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, groups_count * 5))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_OAM_RATE:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_OAM_RATE:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_LOAD_INFO:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_BC_LASER_POWER_OFF:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SLEEP:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ADD_LUE_RULE:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DEL_LUE_RULE:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ENABLE_POLICER:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DISABLE_POLICER:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_EPOC_SDM_STATS:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_EPOC_CMC_STATS:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_EPOC_CNU_STATS:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_DN_BCAST_QUEUE:
            {
                uint8_t port_count;
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &port_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * port_count);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, port_count * 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_DN_BCAST_QUEUE:
            {
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_DN_FILTER_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_DN_USER_RULES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_DYN_LEARN_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_LUE_RULE_TABLE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_UP_FILTER_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_UP_USER_RULES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLR_DN_CLASS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLR_UP_CLASS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DEL_IGMP_GROUP:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DELETE_MCAST_DOMAIN_CONFIG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DELETE_MCAST_GROUP:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_EPOC_UNUSED0:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_EPOC_UNUSED1:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_FIND_LUE_RULE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_GPIO_VALUE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_LUE_FIELD:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_MDIO:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_PHY_ADDR_MDIO:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_PORT_RATE_CONTROL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_QUEUE_RATE_CONTROL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_LASER_TX_POWER_OFF:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_LOOPBACK_DISABLE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_LOOPBACK_ENABLE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ONU_DISABLE_USER_TRAFFIC:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ONU_ENABLE_USER_TRAFFIC:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_PROTECTION_SWITCH:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_GPIO_VALUE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_LUE_FIELD:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_MDIO:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_PHY_ADDR_MDIO:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_PORT_RATE_CONTROL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_QUEUE_RATE_CONTROL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_AUTO_ADMIN_CTRL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_AUTO_RENEGOTIATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAC_ADD_GROUP_ADDR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAC_DEL_GROUP_ADDR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAC_INIT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAC_SELF_TEST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAU_ADMIN_CTRL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAU_RESET:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_PHY_ADMIN_CONTROL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_PORT_ADMIN_CTRL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_RPT_IN_SERVICE_TEST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_RPT_RESET:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tek_action_value_base_add_rule_count_rules(bcmolt_epon_oam_buf *buf)
{
    uint32_t count = 0;
    uint32_t dummy = 0;
    bcmolt_epon_oam_buf bufClone = *buf;
    while (BCMOS_TRUE)
    {
        if (!bcmolt_epon_oam_tek_onu_rule_scan(&bufClone, &dummy))
        {
            break;
        }

        count += 1;
    }

    return count;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tek_action_value_base_new_del_rule_count_rules(bcmolt_epon_oam_buf *buf)
{
    uint32_t count = 0;
    uint32_t dummy = 0;
    bcmolt_epon_oam_buf bufClone = *buf;
    while (BCMOS_TRUE)
    {
        if (!bcmolt_epon_oam_tek_onu_rule_scan(&bufClone, &dummy))
        {
            break;
        }

        count += 1;
    }

    return count;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tek_action_value_base_delete_rule_count_rules(bcmolt_epon_oam_buf *buf)
{
    uint32_t count = 0;
    uint32_t dummy = 0;
    bcmolt_epon_oam_buf bufClone = *buf;
    while (BCMOS_TRUE)
    {
        if (!bcmolt_epon_oam_tek_onu_rule_scan(&bufClone, &dummy))
        {
            break;
        }

        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_var_container_pack(bcmolt_epon_oam_tek_var_container *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_tek_branch_pack(this->branch, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->branch)
    {
        case BCMOLT_EPON_OAM_TEK_BRANCH_END:
            {
                if ((this->u.end.unknown_count > 0) && (this->u.end.unknown == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"unknown\" of struct \"bcmolt_epon_oam_tek_var_container_end\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.end.unknown, this->u.end.unknown_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_NAME_BINDING:
            {
                if (!bcmolt_epon_oam_tek_object_context_pack(&this->u.name_binding.object_context, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_tek_attribute_value_pack(&this->u.attribute.attribute, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_ACTION:
            {
                if (!bcmolt_epon_oam_tek_action_value_base_pack(&this->u.action.action, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_OBJECT:
        case BCMOLT_EPON_OAM_TEK_BRANCH_PACKAGE:
        default:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.def.leaf))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.def.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.def.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tek_var_container_get_packed_length(bcmolt_epon_oam_tek_var_container *this)
{
    uint32_t count = 1;
    switch (this->branch)
    {
        case BCMOLT_EPON_OAM_TEK_BRANCH_END:
            {
                count += this->u.end.unknown_count;
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_NAME_BINDING:
            {
                count += bcmolt_epon_oam_tek_object_context_get_packed_length(&this->u.name_binding.object_context);
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_ATTRIBUTE:
            {
                count += bcmolt_epon_oam_tek_attribute_value_get_packed_length(&this->u.attribute.attribute);
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_ACTION:
            {
                count += bcmolt_epon_oam_tek_action_value_base_get_packed_length(&this->u.action.action);
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_OBJECT:
        case BCMOLT_EPON_OAM_TEK_BRANCH_PACKAGE:
        default:
            {
                count += 3;
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_var_container_unpack(bcmolt_epon_oam_tek_var_container *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_tek_branch_unpack(&this->branch, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->branch)
    {
        case BCMOLT_EPON_OAM_TEK_BRANCH_END:
            {
                this->u.end.unknown_count = bcmolt_epon_oam_tek_var_container_end_count_unknown(buf);
                if ((this->u.end.unknown_count > 0) && (this->u.end.unknown == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"unknown\" of struct \"bcmolt_epon_oam_tek_var_container_end\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.end.unknown = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.end.unknown_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.end.unknown, this->u.end.unknown_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_NAME_BINDING:
            {
                if (!bcmolt_epon_oam_tek_object_context_unpack(&this->u.name_binding.object_context, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_tek_attribute_value_unpack(&this->u.attribute.attribute, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_ACTION:
            {
                if (!bcmolt_epon_oam_tek_action_value_base_unpack(&this->u.action.action, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_OBJECT:
        case BCMOLT_EPON_OAM_TEK_BRANCH_PACKAGE:
        default:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.def.leaf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.def.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.def.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.def.width == 0) ? 0x0080 : this->u.def.width, buf->curr);
                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.def.width == 0) ? 0x0080 : this->u.def.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_var_container_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_tek_branch branch;
    if (!bcmolt_epon_oam_tek_branch_unpack(&branch, packed))
    {
        return BCMOS_FALSE;
    }

    switch (branch)
    {
        case BCMOLT_EPON_OAM_TEK_BRANCH_END:
            {
                uint32_t unknown_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(packed, 1))
                    {
                        break;
                    }

                    unknown_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(unknown_elem_count * sizeof(uint8_t));
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_NAME_BINDING:
            {
                if (!bcmolt_epon_oam_tek_object_context_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_tek_attribute_value_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_ACTION:
            {
                if (!bcmolt_epon_oam_tek_action_value_base_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_OBJECT:
        case BCMOLT_EPON_OAM_TEK_BRANCH_PACKAGE:
        default:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tek_var_container_end_count_unknown(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_set_resp_action_value_base_pack(bcmolt_epon_oam_tek_set_resp_action_value_base *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t preLenFieldPos;
    uint32_t bytesAfterLenField;
    if (!bcmolt_epon_oam_tek_leaf_action_pack(this->leaf, buf))
    {
        return BCMOS_FALSE;
    }

    if (this->width >= 0x0080)
    {
        bcmolt_epon_oam_buf_write_u8(buf, this->width);
        return BCMOS_TRUE;
    }

    preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

    /* skip over length field (we'll fill it in later) */
    if (!bcmolt_epon_oam_buf_skip(buf, 1))
    {
        return BCMOS_FALSE;
    }

    switch (this->leaf)
    {
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_QUEUE_CONFIG:
            {
                uint8_t i0;
                uint8_t i1;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.get_queue_config.links_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_queue_config.links_count > 0) && (this->u.get_queue_config.links == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"links\" of struct \"bcmolt_epon_oam_tek_set_resp_action_value_base_get_queue_config\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i0 = 0; i0 < this->u.get_queue_config.links_count; i0++)
                {
                    if (!bcmolt_epon_oam_tek_onu_queue_config_pack(&this->u.get_queue_config.links[i0], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.get_queue_config.ports_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_queue_config.ports_count > 0) && (this->u.get_queue_config.ports == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"ports\" of struct \"bcmolt_epon_oam_tek_set_resp_action_value_base_get_queue_config\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i1 = 0; i1 < this->u.get_queue_config.ports_count; i1++)
                {
                    if (!bcmolt_epon_oam_tek_onu_queue_config_pack(&this->u.get_queue_config.ports[i1], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }

                if (!bcmolt_epon_oam_tek_onu_queue_config_pack(&this->u.get_queue_config.multicast, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_IGMP_CONFIG:
            {
                uint8_t i2;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.get_igmp_config.robustness_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.get_igmp_config.last_member_query_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.get_igmp_config.ports_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_igmp_config.ports_count > 0) && (this->u.get_igmp_config.ports == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"ports\" of struct \"bcmolt_epon_oam_tek_set_resp_action_value_base_get_igmp_config\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i2 = 0; i2 < this->u.get_igmp_config.ports_count; i2++)
                {
                    if (!bcmolt_epon_oam_tek_igmp_snooping_port_config_pack(&this->u.get_igmp_config.ports[i2], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }

                if (!bcmolt_epon_oam_tek_igmp_forwarding_qualifer_pack(this->u.get_igmp_config.grp_forward, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_tek_igmp_snooping_options_pack(this->u.get_igmp_config.options, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_IGMP_GROUP_INFO:
            {
                uint8_t i3;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.get_igmp_group_info.groups_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_igmp_group_info.groups_count > 0) && (this->u.get_igmp_group_info.groups == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"groups\" of struct \"bcmolt_epon_oam_tek_set_resp_action_value_base_get_igmp_group_info\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i3 = 0; i3 < this->u.get_igmp_group_info.groups_count; i3++)
                {
                    if (!bcmolt_epon_oam_tek_onu_igmp_group_no_vid_pack(&this->u.get_igmp_group_info.groups[i3], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_OAM_RATE:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.get_oam_rate.max_oam_rate))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.get_oam_rate.min_oam_rate))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_LOAD_INFO:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.get_load_info.boot_version))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.get_load_info.boot_crc))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.get_load_info.personality_version))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.get_load_info.personality_crc))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.get_load_info.app0version))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.get_load_info.app0crc))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.get_load_info.app1version))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.get_load_info.app1crc))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.get_load_info.diagnostic_version))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.get_load_info.diagnostic_crc))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_EPOC_SDM_STATS:
            {
                if (!bcmolt_epon_oam_epoc_sdm250stat_index_pack(this->u.get_epoc_sdm_stats.stat_index, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.get_epoc_sdm_stats.counter_value_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_epoc_sdm_stats.counter_value_count > 0) && (this->u.get_epoc_sdm_stats.counter_value == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"counter_value\" of struct \"bcmolt_epon_oam_tek_set_resp_action_value_base_get_epoc_sdm_stats\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.get_epoc_sdm_stats.counter_value, this->u.get_epoc_sdm_stats.counter_value_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.get_epoc_sdm_stats.rate_value_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_epoc_sdm_stats.rate_value_count > 0) && (this->u.get_epoc_sdm_stats.rate_value == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"rate_value\" of struct \"bcmolt_epon_oam_tek_set_resp_action_value_base_get_epoc_sdm_stats\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.get_epoc_sdm_stats.rate_value, this->u.get_epoc_sdm_stats.rate_value_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.get_epoc_sdm_stats.rate_interval_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_epoc_sdm_stats.rate_interval_count > 0) && (this->u.get_epoc_sdm_stats.rate_interval == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"rate_interval\" of struct \"bcmolt_epon_oam_tek_set_resp_action_value_base_get_epoc_sdm_stats\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.get_epoc_sdm_stats.rate_interval, this->u.get_epoc_sdm_stats.rate_interval_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_EPOC_CMC_STATS:
            {
                if (!bcmolt_epon_oam_epoc_cmc_stat_index_pack(this->u.get_epoc_cmc_stats.stat_index, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.get_epoc_cmc_stats.counter_value_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_epoc_cmc_stats.counter_value_count > 0) && (this->u.get_epoc_cmc_stats.counter_value == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"counter_value\" of struct \"bcmolt_epon_oam_tek_set_resp_action_value_base_get_epoc_cmc_stats\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.get_epoc_cmc_stats.counter_value, this->u.get_epoc_cmc_stats.counter_value_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.get_epoc_cmc_stats.rate_value_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_epoc_cmc_stats.rate_value_count > 0) && (this->u.get_epoc_cmc_stats.rate_value == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"rate_value\" of struct \"bcmolt_epon_oam_tek_set_resp_action_value_base_get_epoc_cmc_stats\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.get_epoc_cmc_stats.rate_value, this->u.get_epoc_cmc_stats.rate_value_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.get_epoc_cmc_stats.rate_interval_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_epoc_cmc_stats.rate_interval_count > 0) && (this->u.get_epoc_cmc_stats.rate_interval == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"rate_interval\" of struct \"bcmolt_epon_oam_tek_set_resp_action_value_base_get_epoc_cmc_stats\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.get_epoc_cmc_stats.rate_interval, this->u.get_epoc_cmc_stats.rate_interval_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_EPOC_CNU_STATS:
            {
                if (!bcmolt_epon_oam_epoc_cnu_stat_index_pack(this->u.get_epoc_cnu_stats.stat_index, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.get_epoc_cnu_stats.counter_value_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_epoc_cnu_stats.counter_value_count > 0) && (this->u.get_epoc_cnu_stats.counter_value == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"counter_value\" of struct \"bcmolt_epon_oam_tek_set_resp_action_value_base_get_epoc_cnu_stats\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.get_epoc_cnu_stats.counter_value, this->u.get_epoc_cnu_stats.counter_value_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.get_epoc_cnu_stats.rate_value_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_epoc_cnu_stats.rate_value_count > 0) && (this->u.get_epoc_cnu_stats.rate_value == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"rate_value\" of struct \"bcmolt_epon_oam_tek_set_resp_action_value_base_get_epoc_cnu_stats\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.get_epoc_cnu_stats.rate_value, this->u.get_epoc_cnu_stats.rate_value_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.get_epoc_cnu_stats.rate_interval_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_epoc_cnu_stats.rate_interval_count > 0) && (this->u.get_epoc_cnu_stats.rate_interval == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"rate_interval\" of struct \"bcmolt_epon_oam_tek_set_resp_action_value_base_get_epoc_cnu_stats\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.get_epoc_cnu_stats.rate_interval, this->u.get_epoc_cnu_stats.rate_interval_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_DN_BCAST_QUEUE:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.get_dn_bcast_queue.port_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_dn_bcast_queue.port_count > 0) && (this->u.get_dn_bcast_queue.queue_per_port == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"queue_per_port\" of struct \"bcmolt_epon_oam_tek_set_resp_action_value_base_get_dn_bcast_queue\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.get_dn_bcast_queue.queue_per_port, this->u.get_dn_bcast_queue.port_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ADD_IGMP_GROUP:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ADD_LUE_RULE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ADD_RULE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ADD_STATIC_ENTRY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_BC_LASER_POWER_OFF:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_DN_FILTER_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_DN_USER_RULES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_DYN_LEARN_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_LUE_RULE_TABLE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_STATS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_UP_FILTER_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_UP_USER_RULES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLR_DN_CLASS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLR_UP_CLASS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DEL_IGMP_GROUP:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DEL_LUE_RULE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DEL_STATIC_ENTRY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DELETE_MCAST_DOMAIN_CONFIG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DELETE_MCAST_GROUP:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DELETE_RULE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DISABLE_POLICER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ENABLE_POLICER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_EPOC_UNUSED0:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_EPOC_UNUSED1:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ERASE_NVS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_FIND_LUE_RULE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_GPIO_CONFIG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_GPIO_VALUE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_LUE_FIELD:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_MDIO:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_PHY_ADDR_MDIO:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_PORT_RATE_CONTROL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_QUEUE_RATE_CONTROL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_LASER_TX_POWER_OFF:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_LOOPBACK_DISABLE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_LOOPBACK_ENABLE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_NEW_ADD_RULE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_NEW_DEL_RULE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ONU_DISABLE_USER_TRAFFIC:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ONU_ENABLE_USER_TRAFFIC:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_PROTECTION_SWITCH:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_RESET_ONU:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_DN_BCAST_QUEUE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_GPIO_CONFIG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_GPIO_VALUE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_IGMP_CONFIG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_LUE_FIELD:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_MDIO:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_OAM_RATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_PHY_ADDR_MDIO:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_PORT_RATE_CONTROL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_QUEUE_CONFIG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_QUEUE_RATE_CONTROL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SLEEP:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_AUTO_ADMIN_CTRL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_AUTO_RENEGOTIATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAC_ADD_GROUP_ADDR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAC_DEL_GROUP_ADDR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAC_INIT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAC_SELF_TEST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAU_ADMIN_CTRL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAU_RESET:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_PHY_ADMIN_CONTROL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_PORT_ADMIN_CTRL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_RPT_IN_SERVICE_TEST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_RPT_RESET:
        default:
            {
                if ((this->u.def.unknown_count > 0) && (this->u.def.unknown == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"unknown\" of struct \"bcmolt_epon_oam_tek_set_resp_action_value_base_def\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.def.unknown, this->u.def.unknown_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
    if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tek_set_resp_action_value_base_get_packed_length(bcmolt_epon_oam_tek_set_resp_action_value_base *this)
{
    if (this->width >= 0x0080)
    {
        return this->width;
    }
    else
    {
        uint32_t count = 3;
        switch (this->leaf)
        {
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_QUEUE_CONFIG:
                {
                    uint32_t i0;
                    uint32_t i1;
                    count += 2 + bcmolt_epon_oam_tek_onu_queue_config_get_packed_length(&this->u.get_queue_config.multicast);
                    if ((this->u.get_queue_config.links_count > 0) && (this->u.get_queue_config.links == NULL))
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"links_count\" of struct \"bcmolt_epon_oam_tek_set_resp_action_value_base\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return 0;
                    }

                    for (i0 = 0; i0 < this->u.get_queue_config.links_count; i0++)
                    {
                        count += bcmolt_epon_oam_tek_onu_queue_config_get_packed_length(&this->u.get_queue_config.links[i0]);
                    }

                    if ((this->u.get_queue_config.ports_count > 0) && (this->u.get_queue_config.ports == NULL))
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"ports_count\" of struct \"bcmolt_epon_oam_tek_set_resp_action_value_base\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return 0;
                    }

                    for (i1 = 0; i1 < this->u.get_queue_config.ports_count; i1++)
                    {
                        count += bcmolt_epon_oam_tek_onu_queue_config_get_packed_length(&this->u.get_queue_config.ports[i1]);
                    }
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_IGMP_CONFIG:
                {
                    count += 6 + (2 * this->u.get_igmp_config.ports_count);
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_IGMP_GROUP_INFO:
                {
                    count += 1 + (5 * this->u.get_igmp_group_info.groups_count);
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_OAM_RATE:
                {
                    count += 2;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_LOAD_INFO:
                {
                    count += 30;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_EPOC_SDM_STATS:
                {
                    count += 4 + this->u.get_epoc_sdm_stats.counter_value_count + this->u.get_epoc_sdm_stats.rate_value_count + this->u.get_epoc_sdm_stats.rate_interval_count;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_EPOC_CMC_STATS:
                {
                    count += 4 + this->u.get_epoc_cmc_stats.counter_value_count + this->u.get_epoc_cmc_stats.rate_value_count + this->u.get_epoc_cmc_stats.rate_interval_count;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_EPOC_CNU_STATS:
                {
                    count += 4 + this->u.get_epoc_cnu_stats.counter_value_count + this->u.get_epoc_cnu_stats.rate_value_count + this->u.get_epoc_cnu_stats.rate_interval_count;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_DN_BCAST_QUEUE:
                {
                    count += 1 + this->u.get_dn_bcast_queue.port_count;
                }
                break;
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ADD_IGMP_GROUP:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ADD_LUE_RULE:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ADD_RULE:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ADD_STATIC_ENTRY:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_BC_LASER_POWER_OFF:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_DN_FILTER_TBL:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_DN_USER_RULES:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_DYN_LEARN_TBL:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_LUE_RULE_TABLE:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_STATS:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_UP_FILTER_TBL:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_UP_USER_RULES:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLR_DN_CLASS:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLR_UP_CLASS:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DEL_IGMP_GROUP:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DEL_LUE_RULE:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DEL_STATIC_ENTRY:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DELETE_MCAST_DOMAIN_CONFIG:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DELETE_MCAST_GROUP:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DELETE_RULE:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DISABLE_POLICER:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ENABLE_POLICER:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_EPOC_UNUSED0:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_EPOC_UNUSED1:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ERASE_NVS:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_FIND_LUE_RULE:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_GPIO_CONFIG:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_GPIO_VALUE:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_LUE_FIELD:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_MDIO:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_PHY_ADDR_MDIO:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_PORT_RATE_CONTROL:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_QUEUE_RATE_CONTROL:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_LASER_TX_POWER_OFF:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_LOOPBACK_DISABLE:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_LOOPBACK_ENABLE:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_NEW_ADD_RULE:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_NEW_DEL_RULE:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ONU_DISABLE_USER_TRAFFIC:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ONU_ENABLE_USER_TRAFFIC:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_PROTECTION_SWITCH:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_RESET_ONU:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_DN_BCAST_QUEUE:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_GPIO_CONFIG:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_GPIO_VALUE:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_IGMP_CONFIG:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_LUE_FIELD:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_MDIO:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_OAM_RATE:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_PHY_ADDR_MDIO:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_PORT_RATE_CONTROL:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_QUEUE_CONFIG:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_QUEUE_RATE_CONTROL:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SLEEP:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_AUTO_ADMIN_CTRL:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_AUTO_RENEGOTIATE:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAC_ADD_GROUP_ADDR:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAC_DEL_GROUP_ADDR:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAC_INIT:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAC_SELF_TEST:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAU_ADMIN_CTRL:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAU_RESET:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_PHY_ADMIN_CONTROL:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_PORT_ADMIN_CTRL:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_RPT_IN_SERVICE_TEST:
            case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_RPT_RESET:
            default:
                {
                    count += this->u.def.unknown_count;
                }
                break;
        }

        return count;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_set_resp_action_value_base_unpack(bcmolt_epon_oam_tek_set_resp_action_value_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    bcmolt_epon_oam_buf postLenBuf;
    if (!bcmolt_epon_oam_tek_leaf_action_unpack(&this->leaf, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->width))
    {
        return BCMOS_FALSE;
    }

    if (this->width >= 0x0080)
    {
        return BCMOS_TRUE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, (this->width == 0) ? 0x0080 : this->width, buf->curr);
    switch (this->leaf)
    {
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_QUEUE_CONFIG:
            {
                uint8_t i0;
                uint8_t i1;
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.get_queue_config.links_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_queue_config.links_count > 0) && (this->u.get_queue_config.links == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"links\" of struct \"bcmolt_epon_oam_tek_set_resp_action_value_base_get_queue_config\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.get_queue_config.links = (bcmolt_epon_oam_tek_onu_queue_config *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.get_queue_config.links_count * sizeof(bcmolt_epon_oam_tek_onu_queue_config));
                    }
                }

                for (i0 = 0; i0 < this->u.get_queue_config.links_count; i0++)
                {
                    if (!bcmolt_epon_oam_tek_onu_queue_config_unpack(&this->u.get_queue_config.links[i0], &postLenBuf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.get_queue_config.ports_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_queue_config.ports_count > 0) && (this->u.get_queue_config.ports == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"ports\" of struct \"bcmolt_epon_oam_tek_set_resp_action_value_base_get_queue_config\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.get_queue_config.ports = (bcmolt_epon_oam_tek_onu_queue_config *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.get_queue_config.ports_count * sizeof(bcmolt_epon_oam_tek_onu_queue_config));
                    }
                }

                for (i1 = 0; i1 < this->u.get_queue_config.ports_count; i1++)
                {
                    if (!bcmolt_epon_oam_tek_onu_queue_config_unpack(&this->u.get_queue_config.ports[i1], &postLenBuf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }

                if (!bcmolt_epon_oam_tek_onu_queue_config_unpack(&this->u.get_queue_config.multicast, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_IGMP_CONFIG:
            {
                uint8_t i2;
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.get_igmp_config.robustness_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.get_igmp_config.last_member_query_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.get_igmp_config.ports_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_igmp_config.ports_count > 0) && (this->u.get_igmp_config.ports == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"ports\" of struct \"bcmolt_epon_oam_tek_set_resp_action_value_base_get_igmp_config\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.get_igmp_config.ports = (bcmolt_epon_oam_tek_igmp_snooping_port_config *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.get_igmp_config.ports_count * sizeof(bcmolt_epon_oam_tek_igmp_snooping_port_config));
                    }
                }

                for (i2 = 0; i2 < this->u.get_igmp_config.ports_count; i2++)
                {
                    if (!bcmolt_epon_oam_tek_igmp_snooping_port_config_unpack(&this->u.get_igmp_config.ports[i2], &postLenBuf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }

                if (!bcmolt_epon_oam_tek_igmp_forwarding_qualifer_unpack(&this->u.get_igmp_config.grp_forward, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_tek_igmp_snooping_options_unpack(&this->u.get_igmp_config.options, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_IGMP_GROUP_INFO:
            {
                uint8_t i3;
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.get_igmp_group_info.groups_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_igmp_group_info.groups_count > 0) && (this->u.get_igmp_group_info.groups == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"groups\" of struct \"bcmolt_epon_oam_tek_set_resp_action_value_base_get_igmp_group_info\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.get_igmp_group_info.groups = (bcmolt_epon_oam_tek_onu_igmp_group_no_vid *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.get_igmp_group_info.groups_count * sizeof(bcmolt_epon_oam_tek_onu_igmp_group_no_vid));
                    }
                }

                for (i3 = 0; i3 < this->u.get_igmp_group_info.groups_count; i3++)
                {
                    if (!bcmolt_epon_oam_tek_onu_igmp_group_no_vid_unpack(&this->u.get_igmp_group_info.groups[i3], &postLenBuf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_OAM_RATE:
            {
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.get_oam_rate.max_oam_rate))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.get_oam_rate.min_oam_rate))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_LOAD_INFO:
            {
                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.get_load_info.boot_version))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.get_load_info.boot_crc))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.get_load_info.personality_version))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.get_load_info.personality_crc))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.get_load_info.app0version))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.get_load_info.app0crc))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.get_load_info.app1version))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.get_load_info.app1crc))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.get_load_info.diagnostic_version))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(&postLenBuf, &this->u.get_load_info.diagnostic_crc))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_EPOC_SDM_STATS:
            {
                if (!bcmolt_epon_oam_epoc_sdm250stat_index_unpack(&this->u.get_epoc_sdm_stats.stat_index, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.get_epoc_sdm_stats.counter_value_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_epoc_sdm_stats.counter_value_count > 0) && (this->u.get_epoc_sdm_stats.counter_value == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"counter_value\" of struct \"bcmolt_epon_oam_tek_set_resp_action_value_base_get_epoc_sdm_stats\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.get_epoc_sdm_stats.counter_value = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.get_epoc_sdm_stats.counter_value_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.get_epoc_sdm_stats.counter_value, this->u.get_epoc_sdm_stats.counter_value_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.get_epoc_sdm_stats.rate_value_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_epoc_sdm_stats.rate_value_count > 0) && (this->u.get_epoc_sdm_stats.rate_value == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"rate_value\" of struct \"bcmolt_epon_oam_tek_set_resp_action_value_base_get_epoc_sdm_stats\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.get_epoc_sdm_stats.rate_value = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.get_epoc_sdm_stats.rate_value_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.get_epoc_sdm_stats.rate_value, this->u.get_epoc_sdm_stats.rate_value_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.get_epoc_sdm_stats.rate_interval_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_epoc_sdm_stats.rate_interval_count > 0) && (this->u.get_epoc_sdm_stats.rate_interval == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"rate_interval\" of struct \"bcmolt_epon_oam_tek_set_resp_action_value_base_get_epoc_sdm_stats\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.get_epoc_sdm_stats.rate_interval = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.get_epoc_sdm_stats.rate_interval_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.get_epoc_sdm_stats.rate_interval, this->u.get_epoc_sdm_stats.rate_interval_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_EPOC_CMC_STATS:
            {
                if (!bcmolt_epon_oam_epoc_cmc_stat_index_unpack(&this->u.get_epoc_cmc_stats.stat_index, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.get_epoc_cmc_stats.counter_value_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_epoc_cmc_stats.counter_value_count > 0) && (this->u.get_epoc_cmc_stats.counter_value == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"counter_value\" of struct \"bcmolt_epon_oam_tek_set_resp_action_value_base_get_epoc_cmc_stats\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.get_epoc_cmc_stats.counter_value = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.get_epoc_cmc_stats.counter_value_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.get_epoc_cmc_stats.counter_value, this->u.get_epoc_cmc_stats.counter_value_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.get_epoc_cmc_stats.rate_value_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_epoc_cmc_stats.rate_value_count > 0) && (this->u.get_epoc_cmc_stats.rate_value == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"rate_value\" of struct \"bcmolt_epon_oam_tek_set_resp_action_value_base_get_epoc_cmc_stats\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.get_epoc_cmc_stats.rate_value = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.get_epoc_cmc_stats.rate_value_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.get_epoc_cmc_stats.rate_value, this->u.get_epoc_cmc_stats.rate_value_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.get_epoc_cmc_stats.rate_interval_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_epoc_cmc_stats.rate_interval_count > 0) && (this->u.get_epoc_cmc_stats.rate_interval == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"rate_interval\" of struct \"bcmolt_epon_oam_tek_set_resp_action_value_base_get_epoc_cmc_stats\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.get_epoc_cmc_stats.rate_interval = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.get_epoc_cmc_stats.rate_interval_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.get_epoc_cmc_stats.rate_interval, this->u.get_epoc_cmc_stats.rate_interval_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_EPOC_CNU_STATS:
            {
                if (!bcmolt_epon_oam_epoc_cnu_stat_index_unpack(&this->u.get_epoc_cnu_stats.stat_index, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.get_epoc_cnu_stats.counter_value_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_epoc_cnu_stats.counter_value_count > 0) && (this->u.get_epoc_cnu_stats.counter_value == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"counter_value\" of struct \"bcmolt_epon_oam_tek_set_resp_action_value_base_get_epoc_cnu_stats\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.get_epoc_cnu_stats.counter_value = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.get_epoc_cnu_stats.counter_value_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.get_epoc_cnu_stats.counter_value, this->u.get_epoc_cnu_stats.counter_value_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.get_epoc_cnu_stats.rate_value_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_epoc_cnu_stats.rate_value_count > 0) && (this->u.get_epoc_cnu_stats.rate_value == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"rate_value\" of struct \"bcmolt_epon_oam_tek_set_resp_action_value_base_get_epoc_cnu_stats\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.get_epoc_cnu_stats.rate_value = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.get_epoc_cnu_stats.rate_value_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.get_epoc_cnu_stats.rate_value, this->u.get_epoc_cnu_stats.rate_value_count))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.get_epoc_cnu_stats.rate_interval_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_epoc_cnu_stats.rate_interval_count > 0) && (this->u.get_epoc_cnu_stats.rate_interval == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"rate_interval\" of struct \"bcmolt_epon_oam_tek_set_resp_action_value_base_get_epoc_cnu_stats\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.get_epoc_cnu_stats.rate_interval = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.get_epoc_cnu_stats.rate_interval_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.get_epoc_cnu_stats.rate_interval, this->u.get_epoc_cnu_stats.rate_interval_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_DN_BCAST_QUEUE:
            {
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.get_dn_bcast_queue.port_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.get_dn_bcast_queue.port_count > 0) && (this->u.get_dn_bcast_queue.queue_per_port == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"queue_per_port\" of struct \"bcmolt_epon_oam_tek_set_resp_action_value_base_get_dn_bcast_queue\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.get_dn_bcast_queue.queue_per_port = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.get_dn_bcast_queue.port_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.get_dn_bcast_queue.queue_per_port, this->u.get_dn_bcast_queue.port_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ADD_IGMP_GROUP:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ADD_LUE_RULE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ADD_RULE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ADD_STATIC_ENTRY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_BC_LASER_POWER_OFF:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_DN_FILTER_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_DN_USER_RULES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_DYN_LEARN_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_LUE_RULE_TABLE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_STATS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_UP_FILTER_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_UP_USER_RULES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLR_DN_CLASS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLR_UP_CLASS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DEL_IGMP_GROUP:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DEL_LUE_RULE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DEL_STATIC_ENTRY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DELETE_MCAST_DOMAIN_CONFIG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DELETE_MCAST_GROUP:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DELETE_RULE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DISABLE_POLICER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ENABLE_POLICER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_EPOC_UNUSED0:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_EPOC_UNUSED1:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ERASE_NVS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_FIND_LUE_RULE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_GPIO_CONFIG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_GPIO_VALUE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_LUE_FIELD:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_MDIO:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_PHY_ADDR_MDIO:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_PORT_RATE_CONTROL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_QUEUE_RATE_CONTROL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_LASER_TX_POWER_OFF:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_LOOPBACK_DISABLE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_LOOPBACK_ENABLE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_NEW_ADD_RULE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_NEW_DEL_RULE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ONU_DISABLE_USER_TRAFFIC:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ONU_ENABLE_USER_TRAFFIC:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_PROTECTION_SWITCH:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_RESET_ONU:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_DN_BCAST_QUEUE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_GPIO_CONFIG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_GPIO_VALUE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_IGMP_CONFIG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_LUE_FIELD:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_MDIO:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_OAM_RATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_PHY_ADDR_MDIO:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_PORT_RATE_CONTROL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_QUEUE_CONFIG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_QUEUE_RATE_CONTROL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SLEEP:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_AUTO_ADMIN_CTRL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_AUTO_RENEGOTIATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAC_ADD_GROUP_ADDR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAC_DEL_GROUP_ADDR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAC_INIT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAC_SELF_TEST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAU_ADMIN_CTRL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAU_RESET:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_PHY_ADMIN_CONTROL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_PORT_ADMIN_CTRL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_RPT_IN_SERVICE_TEST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_RPT_RESET:
        default:
            {
                this->u.def.unknown_count = bcmolt_epon_oam_tek_set_resp_action_value_base_def_count_unknown(&postLenBuf);
                if ((this->u.def.unknown_count > 0) && (this->u.def.unknown == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"unknown\" of struct \"bcmolt_epon_oam_tek_set_resp_action_value_base_def\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.def.unknown = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.def.unknown_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.def.unknown, this->u.def.unknown_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(buf, (this->width == 0) ? 0x0080 : this->width))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_set_resp_action_value_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_tek_leaf_action leaf;
    bcmolt_epon_oam_buf postLenBuf;
    uint8_t length;
    if (!bcmolt_epon_oam_tek_leaf_action_unpack(&leaf, packed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
    {
        return BCMOS_FALSE;
    }

    if (length >= 0x0080)
    {
        return BCMOS_TRUE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
    switch (leaf)
    {
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_QUEUE_CONFIG:
            {
                uint8_t links_count;
                uint8_t i0;
                uint8_t ports_count;
                uint8_t i1;
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &links_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_tek_onu_queue_config) * links_count);
                for (i0 = 0; i0 < links_count; i0++)
                {
                    if (!bcmolt_epon_oam_tek_onu_queue_config_scan(&postLenBuf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &ports_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_tek_onu_queue_config) * ports_count);
                for (i1 = 0; i1 < ports_count; i1++)
                {
                    if (!bcmolt_epon_oam_tek_onu_queue_config_scan(&postLenBuf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }

                if (!bcmolt_epon_oam_tek_onu_queue_config_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_IGMP_CONFIG:
            {
                uint8_t ports_count;
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &ports_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_tek_igmp_snooping_port_config) * ports_count);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, ports_count * 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_IGMP_GROUP_INFO:
            {
                uint8_t groups_count;
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &groups_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_tek_onu_igmp_group_no_vid) * groups_count);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, groups_count * 5))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_OAM_RATE:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_LOAD_INFO:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_EPOC_SDM_STATS:
            {
                uint8_t counter_value_count;
                uint8_t rate_value_count;
                uint8_t rate_interval_count;
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &counter_value_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * counter_value_count);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, counter_value_count * 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &rate_value_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * rate_value_count);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, rate_value_count * 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &rate_interval_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * rate_interval_count);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, rate_interval_count * 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_EPOC_CMC_STATS:
            {
                uint8_t counter_value_count;
                uint8_t rate_value_count;
                uint8_t rate_interval_count;
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &counter_value_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * counter_value_count);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, counter_value_count * 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &rate_value_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * rate_value_count);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, rate_value_count * 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &rate_interval_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * rate_interval_count);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, rate_interval_count * 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_EPOC_CNU_STATS:
            {
                uint8_t counter_value_count;
                uint8_t rate_value_count;
                uint8_t rate_interval_count;
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &counter_value_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * counter_value_count);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, counter_value_count * 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &rate_value_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * rate_value_count);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, rate_value_count * 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &rate_interval_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * rate_interval_count);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, rate_interval_count * 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_DN_BCAST_QUEUE:
            {
                uint8_t port_count;
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &port_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * port_count);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, port_count * 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ADD_IGMP_GROUP:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ADD_LUE_RULE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ADD_RULE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ADD_STATIC_ENTRY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_BC_LASER_POWER_OFF:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_DN_FILTER_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_DN_USER_RULES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_DYN_LEARN_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_LUE_RULE_TABLE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_STATS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_UP_FILTER_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLEAR_UP_USER_RULES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLR_DN_CLASS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_CLR_UP_CLASS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DEL_IGMP_GROUP:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DEL_LUE_RULE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DEL_STATIC_ENTRY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DELETE_MCAST_DOMAIN_CONFIG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DELETE_MCAST_GROUP:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DELETE_RULE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_DISABLE_POLICER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ENABLE_POLICER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_EPOC_UNUSED0:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_EPOC_UNUSED1:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ERASE_NVS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_FIND_LUE_RULE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_GPIO_CONFIG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_GPIO_VALUE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_LUE_FIELD:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_MDIO:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_PHY_ADDR_MDIO:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_PORT_RATE_CONTROL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_GET_QUEUE_RATE_CONTROL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_LASER_TX_POWER_OFF:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_LOOPBACK_DISABLE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_LOOPBACK_ENABLE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_NEW_ADD_RULE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_NEW_DEL_RULE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ONU_DISABLE_USER_TRAFFIC:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_ONU_ENABLE_USER_TRAFFIC:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_PROTECTION_SWITCH:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_RESET_ONU:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_DN_BCAST_QUEUE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_GPIO_CONFIG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_GPIO_VALUE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_IGMP_CONFIG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_LUE_FIELD:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_MDIO:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_OAM_RATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_PHY_ADDR_MDIO:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_PORT_RATE_CONTROL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_QUEUE_CONFIG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SET_QUEUE_RATE_CONTROL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_SLEEP:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_AUTO_ADMIN_CTRL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_AUTO_RENEGOTIATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAC_ADD_GROUP_ADDR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAC_DEL_GROUP_ADDR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAC_INIT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAC_SELF_TEST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAU_ADMIN_CTRL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_MAU_RESET:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_PHY_ADMIN_CONTROL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_PORT_ADMIN_CTRL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_RPT_IN_SERVICE_TEST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ACTION_STD_RPT_RESET:
        default:
            {
                uint32_t unknown_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                    {
                        break;
                    }

                    unknown_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(unknown_elem_count * sizeof(uint8_t));
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tek_set_resp_action_value_base_def_count_unknown(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_set_resp_var_container_base_pack(bcmolt_epon_oam_tek_set_resp_var_container_base *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_tek_branch_pack(this->branch, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->branch)
    {
        case BCMOLT_EPON_OAM_TEK_BRANCH_END:
            {
                if ((this->u.end.unknown_count > 0) && (this->u.end.unknown == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"unknown\" of struct \"bcmolt_epon_oam_tek_set_resp_var_container_base_end\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.end.unknown, this->u.end.unknown_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_NAME_BINDING:
            {
                if (!bcmolt_epon_oam_tek_object_context_pack(&this->u.name_binding.object_context, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_tek_attribute_value_pack(&this->u.attribute.attribute, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_ACTION:
            {
                if (!bcmolt_epon_oam_tek_set_resp_action_value_base_pack(&this->u.action.action, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_OBJECT:
        case BCMOLT_EPON_OAM_TEK_BRANCH_PACKAGE:
        default:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.def.leaf))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.def.width >= 0x0080)
                {
                    bcmolt_epon_oam_buf_write_u8(buf, this->u.def.width);
                    return BCMOS_TRUE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, (bytesAfterLenField == 0) ? 0x0080 : (bytesAfterLenField == 0x0080) ? 0 : bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tek_set_resp_var_container_base_get_packed_length(bcmolt_epon_oam_tek_set_resp_var_container_base *this)
{
    uint32_t count = 1;
    switch (this->branch)
    {
        case BCMOLT_EPON_OAM_TEK_BRANCH_END:
            {
                count += this->u.end.unknown_count;
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_NAME_BINDING:
            {
                count += bcmolt_epon_oam_tek_object_context_get_packed_length(&this->u.name_binding.object_context);
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_ATTRIBUTE:
            {
                count += bcmolt_epon_oam_tek_attribute_value_get_packed_length(&this->u.attribute.attribute);
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_ACTION:
            {
                count += bcmolt_epon_oam_tek_set_resp_action_value_base_get_packed_length(&this->u.action.action);
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_OBJECT:
        case BCMOLT_EPON_OAM_TEK_BRANCH_PACKAGE:
        default:
            {
                count += 3;
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_set_resp_var_container_base_unpack(bcmolt_epon_oam_tek_set_resp_var_container_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_tek_branch_unpack(&this->branch, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->branch)
    {
        case BCMOLT_EPON_OAM_TEK_BRANCH_END:
            {
                this->u.end.unknown_count = bcmolt_epon_oam_tek_set_resp_var_container_base_end_count_unknown(buf);
                if ((this->u.end.unknown_count > 0) && (this->u.end.unknown == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"unknown\" of struct \"bcmolt_epon_oam_tek_set_resp_var_container_base_end\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.end.unknown = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.end.unknown_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.end.unknown, this->u.end.unknown_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_NAME_BINDING:
            {
                if (!bcmolt_epon_oam_tek_object_context_unpack(&this->u.name_binding.object_context, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_tek_attribute_value_unpack(&this->u.attribute.attribute, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_ACTION:
            {
                if (!bcmolt_epon_oam_tek_set_resp_action_value_base_unpack(&this->u.action.action, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_OBJECT:
        case BCMOLT_EPON_OAM_TEK_BRANCH_PACKAGE:
        default:
            {
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.def.leaf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.def.width))
                {
                    return BCMOS_FALSE;
                }

                if (this->u.def.width >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (this->u.def.width == 0) ? 0x0080 : this->u.def.width, buf->curr);
                if (!bcmolt_epon_oam_buf_skip(buf, (this->u.def.width == 0) ? 0x0080 : this->u.def.width))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_set_resp_var_container_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_tek_branch branch;
    if (!bcmolt_epon_oam_tek_branch_unpack(&branch, packed))
    {
        return BCMOS_FALSE;
    }

    switch (branch)
    {
        case BCMOLT_EPON_OAM_TEK_BRANCH_END:
            {
                uint32_t unknown_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(packed, 1))
                    {
                        break;
                    }

                    unknown_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(unknown_elem_count * sizeof(uint8_t));
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_NAME_BINDING:
            {
                if (!bcmolt_epon_oam_tek_object_context_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_tek_attribute_value_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_ACTION:
            {
                if (!bcmolt_epon_oam_tek_set_resp_action_value_base_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_OBJECT:
        case BCMOLT_EPON_OAM_TEK_BRANCH_PACKAGE:
        default:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                if (length >= 0x0080)
                {
                    return BCMOS_TRUE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, (length == 0) ? 0x0080 : length, packed->curr);
                if (!bcmolt_epon_oam_buf_skip(packed, (length == 0) ? 0x0080 : length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tek_set_resp_var_container_base_end_count_unknown(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_vendor_extended_pack(bcmolt_epon_oam_tek_vendor_extended *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_tek_opcode_pack(this->op, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->op)
    {
        case BCMOLT_EPON_OAM_TEK_OPCODE_INFO:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.info.firmware_version))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.info.oui, 3))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.info.product_id))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.info.version))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.info.extended_id, 64))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_mac_address(buf, this->u.info.base_mac))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.info.max_links))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.info.num_ports))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.info.num_assignable_upstream_queues))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.info.max_queues_per_link_upstream))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.info.queue_increment_upstream))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.info.num_assignable_downstream_queues))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.info.max_queues_per_link_downstream))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.info.queue_increment_downstream))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.info.upstream_buffer_available))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.info.downstream_buffer_available))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.info.jedec_manufacturer_id))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.info.chip_id))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.info.chip_version))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_GET_REQUEST:
            {
                uint32_t i0;
                if ((this->u.get_request.vars_count > 0) && (this->u.get_request.vars == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vars\" of struct \"bcmolt_epon_oam_tek_vendor_extended_get_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i0 = 0; i0 < this->u.get_request.vars_count; i0++)
                {
                    if (!bcmolt_epon_oam_tek_var_descriptor_pack(&this->u.get_request.vars[i0], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_GET_RESPONSE:
            {
                uint32_t i1;
                if ((this->u.get_response.vars_count > 0) && (this->u.get_response.vars == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vars\" of struct \"bcmolt_epon_oam_tek_vendor_extended_get_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i1 = 0; i1 < this->u.get_response.vars_count; i1++)
                {
                    if (!bcmolt_epon_oam_tek_var_container_pack(&this->u.get_response.vars[i1], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_SET_REQUEST:
            {
                uint32_t i2;
                if ((this->u.set_request.vars_count > 0) && (this->u.set_request.vars == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vars\" of struct \"bcmolt_epon_oam_tek_vendor_extended_set_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i2 = 0; i2 < this->u.set_request.vars_count; i2++)
                {
                    if (!bcmolt_epon_oam_tek_var_container_pack(&this->u.set_request.vars[i2], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_SET_RESPONSE:
            {
                uint32_t i3;
                if ((this->u.set_response.vars_count > 0) && (this->u.set_response.vars == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vars\" of struct \"bcmolt_epon_oam_tek_vendor_extended_set_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i3 = 0; i3 < this->u.set_response.vars_count; i3++)
                {
                    if (!bcmolt_epon_oam_tek_set_resp_var_container_base_pack(&this->u.set_response.vars[i3], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_MULTICAST_REGISTER:
            {
                if (!bcmolt_epon_oam_ieee_register_flags_pack(this->u.multicast_register.flags, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.multicast_register.multicast_llid))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.multicast_register.unicast_llid))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_MULTICAST_REGISTER_RESPONSE:
            {
                if (!bcmolt_epon_oam_ieee_register_ack_flags_pack(this->u.multicast_register_response.flags, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.multicast_register_response.multicast_llid))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.multicast_register_response.unicast_llid))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_KEY_EXCHANGE:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.key_exchange.key_number))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.key_exchange.key_length))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.key_exchange.key_length > 0) && (this->u.key_exchange.key_data == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"key_data\" of struct \"bcmolt_epon_oam_tek_vendor_extended_key_exchange\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.key_exchange.key_data, this->u.key_exchange.key_length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_FILE_ACK:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.file_ack.block))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_tek_file_transfer_error_pack(this->u.file_ack.error, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_FILE_DATA:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.file_data.block))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.file_data.length))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.file_data.length > 0) && (this->u.file_data.data == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"data\" of struct \"bcmolt_epon_oam_tek_vendor_extended_file_data\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.file_data.data, this->u.file_data.length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_FILE_READ_REQUEST:
            {
                if (!bcmolt_epon_oam_tek_file_type_pack(this->u.file_read_request.file_type, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_FILE_WRITE_REQUEST:
            {
                if (!bcmolt_epon_oam_tek_file_type_pack(this->u.file_write_request.file_type, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_UNACKED_ACTION:
            {
                uint32_t i4;
                if ((this->u.unacked_action.variable_containers_count > 0) && (this->u.unacked_action.variable_containers == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"variable_containers\" of struct \"bcmolt_epon_oam_tek_vendor_extended_unacked_action\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i4 = 0; i4 < this->u.unacked_action.variable_containers_count; i4++)
                {
                    if (!bcmolt_epon_oam_tek_var_container_pack(&this->u.unacked_action.variable_containers[i4], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_I2C_BSC_READ_REQUEST:
        case BCMOLT_EPON_OAM_TEK_OPCODE_I2C_BSC_READ_RESPONSE:
        case BCMOLT_EPON_OAM_TEK_OPCODE_I2C_BSC_WRITE_REQUEST:
        case BCMOLT_EPON_OAM_TEK_OPCODE_I2C_BSC_WRITE_RESPONSE:
        case BCMOLT_EPON_OAM_TEK_OPCODE_LOOP_DETECT:
        case BCMOLT_EPON_OAM_TEK_OPCODE_MULTICAST_REQUEST:
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tek_vendor_extended_get_packed_length(bcmolt_epon_oam_tek_vendor_extended *this)
{
    uint32_t count = 1;
    switch (this->op)
    {
        case BCMOLT_EPON_OAM_TEK_OPCODE_INFO:
            {
                count += 99;
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_GET_REQUEST:
            {
                uint32_t i0;
                if ((this->u.get_request.vars_count > 0) && (this->u.get_request.vars == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vars_count\" of struct \"bcmolt_epon_oam_tek_vendor_extended\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return 0;
                }

                for (i0 = 0; i0 < this->u.get_request.vars_count; i0++)
                {
                    count += bcmolt_epon_oam_tek_var_descriptor_get_packed_length(&this->u.get_request.vars[i0]);
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_GET_RESPONSE:
            {
                uint32_t i1;
                if ((this->u.get_response.vars_count > 0) && (this->u.get_response.vars == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vars_count\" of struct \"bcmolt_epon_oam_tek_vendor_extended\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return 0;
                }

                for (i1 = 0; i1 < this->u.get_response.vars_count; i1++)
                {
                    count += bcmolt_epon_oam_tek_var_container_get_packed_length(&this->u.get_response.vars[i1]);
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_SET_REQUEST:
            {
                uint32_t i2;
                if ((this->u.set_request.vars_count > 0) && (this->u.set_request.vars == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vars_count\" of struct \"bcmolt_epon_oam_tek_vendor_extended\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return 0;
                }

                for (i2 = 0; i2 < this->u.set_request.vars_count; i2++)
                {
                    count += bcmolt_epon_oam_tek_var_container_get_packed_length(&this->u.set_request.vars[i2]);
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_SET_RESPONSE:
            {
                uint32_t i3;
                if ((this->u.set_response.vars_count > 0) && (this->u.set_response.vars == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vars_count\" of struct \"bcmolt_epon_oam_tek_vendor_extended\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return 0;
                }

                for (i3 = 0; i3 < this->u.set_response.vars_count; i3++)
                {
                    count += bcmolt_epon_oam_tek_set_resp_var_container_base_get_packed_length(&this->u.set_response.vars[i3]);
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_MULTICAST_REGISTER:
            {
                count += 5;
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_MULTICAST_REGISTER_RESPONSE:
            {
                count += 5;
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_KEY_EXCHANGE:
            {
                count += 2 + this->u.key_exchange.key_length;
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_FILE_ACK:
            {
                count += 3;
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_FILE_DATA:
            {
                count += 4 + this->u.file_data.length;
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_FILE_READ_REQUEST:
            {
                count += 1;
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_FILE_WRITE_REQUEST:
            {
                count += 1;
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_UNACKED_ACTION:
            {
                uint32_t i4;
                if ((this->u.unacked_action.variable_containers_count > 0) && (this->u.unacked_action.variable_containers == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"variable_containers_count\" of struct \"bcmolt_epon_oam_tek_vendor_extended\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return 0;
                }

                for (i4 = 0; i4 < this->u.unacked_action.variable_containers_count; i4++)
                {
                    count += bcmolt_epon_oam_tek_var_container_get_packed_length(&this->u.unacked_action.variable_containers[i4]);
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_I2C_BSC_READ_REQUEST:
        case BCMOLT_EPON_OAM_TEK_OPCODE_I2C_BSC_READ_RESPONSE:
        case BCMOLT_EPON_OAM_TEK_OPCODE_I2C_BSC_WRITE_REQUEST:
        case BCMOLT_EPON_OAM_TEK_OPCODE_I2C_BSC_WRITE_RESPONSE:
        case BCMOLT_EPON_OAM_TEK_OPCODE_LOOP_DETECT:
        case BCMOLT_EPON_OAM_TEK_OPCODE_MULTICAST_REQUEST:
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_vendor_extended_unpack(bcmolt_epon_oam_tek_vendor_extended *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_tek_opcode_unpack(&this->op, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->op)
    {
        case BCMOLT_EPON_OAM_TEK_OPCODE_INFO:
            {
                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.info.firmware_version))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.info.oui, 3))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.info.product_id))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.info.version))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.info.extended_id, 64))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_read_mac_address(buf, &this->u.info.base_mac))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.info.max_links))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.info.num_ports))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.info.num_assignable_upstream_queues))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.info.max_queues_per_link_upstream))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.info.queue_increment_upstream))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.info.num_assignable_downstream_queues))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.info.max_queues_per_link_downstream))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.info.queue_increment_downstream))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.info.upstream_buffer_available))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.info.downstream_buffer_available))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.info.jedec_manufacturer_id))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.info.chip_id))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_read_u32(buf, &this->u.info.chip_version))
                {
                    /*Optional unpack fails do not cause errors */
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_GET_REQUEST:
            {
                uint32_t i0;
                this->u.get_request.vars_count = bcmolt_epon_oam_tek_vendor_extended_get_request_count_vars(buf);
                if ((this->u.get_request.vars_count > 0) && (this->u.get_request.vars == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vars\" of struct \"bcmolt_epon_oam_tek_vendor_extended_get_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.get_request.vars = (bcmolt_epon_oam_tek_var_descriptor *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.get_request.vars_count * sizeof(bcmolt_epon_oam_tek_var_descriptor));
                    }
                }

                for (i0 = 0; i0 < this->u.get_request.vars_count; i0++)
                {
                    if (!bcmolt_epon_oam_tek_var_descriptor_unpack(&this->u.get_request.vars[i0], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_GET_RESPONSE:
            {
                uint32_t i1;
                this->u.get_response.vars_count = bcmolt_epon_oam_tek_vendor_extended_get_response_count_vars(buf);
                if ((this->u.get_response.vars_count > 0) && (this->u.get_response.vars == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vars\" of struct \"bcmolt_epon_oam_tek_vendor_extended_get_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.get_response.vars = (bcmolt_epon_oam_tek_var_container *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.get_response.vars_count * sizeof(bcmolt_epon_oam_tek_var_container));
                    }
                }

                for (i1 = 0; i1 < this->u.get_response.vars_count; i1++)
                {
                    if (!bcmolt_epon_oam_tek_var_container_unpack(&this->u.get_response.vars[i1], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_SET_REQUEST:
            {
                uint32_t i2;
                this->u.set_request.vars_count = bcmolt_epon_oam_tek_vendor_extended_set_request_count_vars(buf);
                if ((this->u.set_request.vars_count > 0) && (this->u.set_request.vars == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vars\" of struct \"bcmolt_epon_oam_tek_vendor_extended_set_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.set_request.vars = (bcmolt_epon_oam_tek_var_container *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.set_request.vars_count * sizeof(bcmolt_epon_oam_tek_var_container));
                    }
                }

                for (i2 = 0; i2 < this->u.set_request.vars_count; i2++)
                {
                    if (!bcmolt_epon_oam_tek_var_container_unpack(&this->u.set_request.vars[i2], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_SET_RESPONSE:
            {
                uint32_t i3;
                this->u.set_response.vars_count = bcmolt_epon_oam_tek_vendor_extended_set_response_count_vars(buf);
                if ((this->u.set_response.vars_count > 0) && (this->u.set_response.vars == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vars\" of struct \"bcmolt_epon_oam_tek_vendor_extended_set_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.set_response.vars = (bcmolt_epon_oam_tek_set_resp_var_container_base *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.set_response.vars_count * sizeof(bcmolt_epon_oam_tek_set_resp_var_container_base));
                    }
                }

                for (i3 = 0; i3 < this->u.set_response.vars_count; i3++)
                {
                    if (!bcmolt_epon_oam_tek_set_resp_var_container_base_unpack(&this->u.set_response.vars[i3], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_MULTICAST_REGISTER:
            {
                if (!bcmolt_epon_oam_ieee_register_flags_unpack(&this->u.multicast_register.flags, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.multicast_register.multicast_llid))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.multicast_register.unicast_llid))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_MULTICAST_REGISTER_RESPONSE:
            {
                if (!bcmolt_epon_oam_ieee_register_ack_flags_unpack(&this->u.multicast_register_response.flags, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.multicast_register_response.multicast_llid))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.multicast_register_response.unicast_llid))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_KEY_EXCHANGE:
            {
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.key_exchange.key_number))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.key_exchange.key_length))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.key_exchange.key_length > 0) && (this->u.key_exchange.key_data == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"key_data\" of struct \"bcmolt_epon_oam_tek_vendor_extended_key_exchange\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.key_exchange.key_data = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.key_exchange.key_length * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.key_exchange.key_data, this->u.key_exchange.key_length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_FILE_ACK:
            {
                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.file_ack.block))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_tek_file_transfer_error_unpack(&this->u.file_ack.error, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_FILE_DATA:
            {
                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.file_data.block))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.file_data.length))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.file_data.length > 0) && (this->u.file_data.data == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"data\" of struct \"bcmolt_epon_oam_tek_vendor_extended_file_data\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.file_data.data = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.file_data.length * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.file_data.data, this->u.file_data.length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_FILE_READ_REQUEST:
            {
                if (!bcmolt_epon_oam_tek_file_type_unpack(&this->u.file_read_request.file_type, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_FILE_WRITE_REQUEST:
            {
                if (!bcmolt_epon_oam_tek_file_type_unpack(&this->u.file_write_request.file_type, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_UNACKED_ACTION:
            {
                uint32_t i4;
                this->u.unacked_action.variable_containers_count = bcmolt_epon_oam_tek_vendor_extended_unacked_action_count_variable_containers(buf);
                if ((this->u.unacked_action.variable_containers_count > 0) && (this->u.unacked_action.variable_containers == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"variable_containers\" of struct \"bcmolt_epon_oam_tek_vendor_extended_unacked_action\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.unacked_action.variable_containers = (bcmolt_epon_oam_tek_var_container *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.unacked_action.variable_containers_count * sizeof(bcmolt_epon_oam_tek_var_container));
                    }
                }

                for (i4 = 0; i4 < this->u.unacked_action.variable_containers_count; i4++)
                {
                    if (!bcmolt_epon_oam_tek_var_container_unpack(&this->u.unacked_action.variable_containers[i4], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_I2C_BSC_READ_REQUEST:
        case BCMOLT_EPON_OAM_TEK_OPCODE_I2C_BSC_READ_RESPONSE:
        case BCMOLT_EPON_OAM_TEK_OPCODE_I2C_BSC_WRITE_REQUEST:
        case BCMOLT_EPON_OAM_TEK_OPCODE_I2C_BSC_WRITE_RESPONSE:
        case BCMOLT_EPON_OAM_TEK_OPCODE_LOOP_DETECT:
        case BCMOLT_EPON_OAM_TEK_OPCODE_MULTICAST_REQUEST:
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_vendor_extended_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_tek_opcode op;
    if (!bcmolt_epon_oam_tek_opcode_unpack(&op, packed))
    {
        return BCMOS_FALSE;
    }

    switch (op)
    {
        case BCMOLT_EPON_OAM_TEK_OPCODE_INFO:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 3))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 64))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 6))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    /*Optional unpack fails do not cause errors */
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 4))
                {
                    /*Optional unpack fails do not cause errors */
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_GET_REQUEST:
            {
                uint32_t vars_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_tek_var_descriptor_scan(packed, extra_mem))
                    {
                        break;
                    }

                    vars_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(vars_elem_count * sizeof(bcmolt_epon_oam_tek_var_descriptor));
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_GET_RESPONSE:
            {
                uint32_t vars_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_tek_var_container_scan(packed, extra_mem))
                    {
                        break;
                    }

                    vars_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(vars_elem_count * sizeof(bcmolt_epon_oam_tek_var_container));
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_SET_REQUEST:
            {
                uint32_t vars_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_tek_var_container_scan(packed, extra_mem))
                    {
                        break;
                    }

                    vars_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(vars_elem_count * sizeof(bcmolt_epon_oam_tek_var_container));
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_SET_RESPONSE:
            {
                uint32_t vars_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_tek_set_resp_var_container_base_scan(packed, extra_mem))
                    {
                        break;
                    }

                    vars_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(vars_elem_count * sizeof(bcmolt_epon_oam_tek_set_resp_var_container_base));
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_MULTICAST_REGISTER:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_MULTICAST_REGISTER_RESPONSE:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_KEY_EXCHANGE:
            {
                uint8_t key_length;
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(packed, &key_length))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * key_length);
                if (!bcmolt_epon_oam_buf_skip(packed, key_length * 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_FILE_ACK:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_FILE_DATA:
            {
                uint16_t length;
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * length);
                if (!bcmolt_epon_oam_buf_skip(packed, length * 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_FILE_READ_REQUEST:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_FILE_WRITE_REQUEST:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_UNACKED_ACTION:
            {
                uint32_t variable_containers_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_tek_var_container_scan(packed, extra_mem))
                    {
                        break;
                    }

                    variable_containers_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(variable_containers_elem_count * sizeof(bcmolt_epon_oam_tek_var_container));
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_I2C_BSC_READ_REQUEST:
        case BCMOLT_EPON_OAM_TEK_OPCODE_I2C_BSC_READ_RESPONSE:
        case BCMOLT_EPON_OAM_TEK_OPCODE_I2C_BSC_WRITE_REQUEST:
        case BCMOLT_EPON_OAM_TEK_OPCODE_I2C_BSC_WRITE_RESPONSE:
        case BCMOLT_EPON_OAM_TEK_OPCODE_LOOP_DETECT:
        case BCMOLT_EPON_OAM_TEK_OPCODE_MULTICAST_REQUEST:
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tek_vendor_extended_get_request_count_vars(bcmolt_epon_oam_buf *buf)
{
    uint32_t count = 0;
    uint32_t dummy = 0;
    bcmolt_epon_oam_buf bufClone = *buf;
    while (BCMOS_TRUE)
    {
        if (!bcmolt_epon_oam_tek_var_descriptor_scan(&bufClone, &dummy))
        {
            break;
        }

        count += 1;
    }

    return count;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tek_vendor_extended_get_response_count_vars(bcmolt_epon_oam_buf *buf)
{
    uint32_t count = 0;
    uint32_t dummy = 0;
    bcmolt_epon_oam_buf bufClone = *buf;
    while (BCMOS_TRUE)
    {
        if (!bcmolt_epon_oam_tek_var_container_scan(&bufClone, &dummy))
        {
            break;
        }

        count += 1;
    }

    return count;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tek_vendor_extended_set_request_count_vars(bcmolt_epon_oam_buf *buf)
{
    uint32_t count = 0;
    uint32_t dummy = 0;
    bcmolt_epon_oam_buf bufClone = *buf;
    while (BCMOS_TRUE)
    {
        if (!bcmolt_epon_oam_tek_var_container_scan(&bufClone, &dummy))
        {
            break;
        }

        count += 1;
    }

    return count;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tek_vendor_extended_set_response_count_vars(bcmolt_epon_oam_buf *buf)
{
    uint32_t count = 0;
    uint32_t dummy = 0;
    bcmolt_epon_oam_buf bufClone = *buf;
    while (BCMOS_TRUE)
    {
        if (!bcmolt_epon_oam_tek_set_resp_var_container_base_scan(&bufClone, &dummy))
        {
            break;
        }

        count += 1;
    }

    return count;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tek_vendor_extended_unacked_action_count_variable_containers(bcmolt_epon_oam_buf *buf)
{
    uint32_t count = 0;
    uint32_t dummy = 0;
    bcmolt_epon_oam_buf bufClone = *buf;
    while (BCMOS_TRUE)
    {
        if (!bcmolt_epon_oam_tek_var_container_scan(&bufClone, &dummy))
        {
            break;
        }

        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_pmc_file_base_pack(bcmolt_epon_oam_pmc_file_base *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_pmc_file_op_pack(this->file_op, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->file_op)
    {
        case BCMOLT_EPON_OAM_PMC_FILE_OP_HEAD:
            {
                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.head.file))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u32(buf, this->u.head.not_file))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.head.crc))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_PMC_FILE_OP_DATA:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.data.length))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.data.block))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.data.data_count > 0) && (this->u.data.data == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"data\" of struct \"bcmolt_epon_oam_pmc_file_base_data\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.data.data, this->u.data.data_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_PMC_FILE_OP_END:
            {
            }
            break;
        case BCMOLT_EPON_OAM_PMC_FILE_OP_IDX:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.idx.idx))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_PMC_FILE_OP_ACK:
            {
                if (!bcmolt_epon_oam_pmc_file_op_pack(this->u.ack.frame_type_ack, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_pmc_error_code_pack(this->u.ack.error_code, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.ack.block_rx))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_pmc_file_base_get_packed_length(bcmolt_epon_oam_pmc_file_base *this)
{
    uint32_t count = 2;
    switch (this->file_op)
    {
        case BCMOLT_EPON_OAM_PMC_FILE_OP_HEAD:
            {
                count += 10;
            }
            break;
        case BCMOLT_EPON_OAM_PMC_FILE_OP_DATA:
            {
                count += 4 + this->u.data.data_count;
            }
            break;
        case BCMOLT_EPON_OAM_PMC_FILE_OP_END:
            {
            }
            break;
        case BCMOLT_EPON_OAM_PMC_FILE_OP_IDX:
            {
                count += 2;
            }
            break;
        case BCMOLT_EPON_OAM_PMC_FILE_OP_ACK:
            {
                count += 6;
            }
            break;
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_pmc_file_base_unpack(bcmolt_epon_oam_pmc_file_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_pmc_file_op_unpack(&this->file_op, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->file_op)
    {
        case BCMOLT_EPON_OAM_PMC_FILE_OP_HEAD:
            {
                if (!bcmolt_epon_oam_buf_read_u32(buf, &this->u.head.file))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u32(buf, &this->u.head.not_file))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.head.crc))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_PMC_FILE_OP_DATA:
            {
                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.data.length))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.data.block))
                {
                    return BCMOS_FALSE;
                }

                this->u.data.data_count = bcmolt_epon_oam_pmc_file_base_data_count_data(buf);
                if ((this->u.data.data_count > 0) && (this->u.data.data == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"data\" of struct \"bcmolt_epon_oam_pmc_file_base_data\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.data.data = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.data.data_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.data.data, this->u.data.data_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_PMC_FILE_OP_END:
            {
            }
            break;
        case BCMOLT_EPON_OAM_PMC_FILE_OP_IDX:
            {
                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.idx.idx))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_PMC_FILE_OP_ACK:
            {
                if (!bcmolt_epon_oam_pmc_file_op_unpack(&this->u.ack.frame_type_ack, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_pmc_error_code_unpack(&this->u.ack.error_code, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.ack.block_rx))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_pmc_file_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_pmc_file_op file_op;
    if (!bcmolt_epon_oam_pmc_file_op_unpack(&file_op, packed))
    {
        return BCMOS_FALSE;
    }

    switch (file_op)
    {
        case BCMOLT_EPON_OAM_PMC_FILE_OP_HEAD:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_PMC_FILE_OP_DATA:
            {
                uint32_t data_elem_count = 0;
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(packed, 1))
                    {
                        break;
                    }

                    data_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(data_elem_count * sizeof(uint8_t));
            }
            break;
        case BCMOLT_EPON_OAM_PMC_FILE_OP_END:
            {
            }
            break;
        case BCMOLT_EPON_OAM_PMC_FILE_OP_IDX:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_PMC_FILE_OP_ACK:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_pmc_file_base_data_count_data(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_pmc_vendor_extended_base_pack(bcmolt_epon_oam_pmc_vendor_extended_base *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_pmc_op_code_pack(this->op, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->op)
    {
        case BCMOLT_EPON_OAM_PMC_OP_CODE_FIRMWARE_UPDATE:
            {
                if (!bcmolt_epon_oam_pmc_file_base_pack(&this->u.firmware_update.file_info, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_PMC_OP_CODE_ACKNOWLEDGE:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_AUTHENTICATE_ONU:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_ENCRYPTION_ENABLE_DISABLE:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_ENCRYPTION_KEY:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_GET_ONU_VERSIONS_REQUEST:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_GET_ONU_VERSIONS_RESPONSE:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_IGMP_SNOOPING_PACKETS:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_MAGIC_NUMBER:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_PHY_LOOP_BACK_CONTROL:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_PING_REQUEST:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_PING_RESPONSE:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_RE_REGISTER:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_REMOTE_ACCESS:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_SET_ALARM_THRESHOLDS:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_THRESHOLD_REPORT_VALUES:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_TURN_ONU_IN_TO_OFF_MODE:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_UNI_PORT_CONFIGURE:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_UNI_PORT_STATUS_REQUEST:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_UNI_PORT_STATUS_RESPONSE:
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_pmc_vendor_extended_base_get_packed_length(bcmolt_epon_oam_pmc_vendor_extended_base *this)
{
    uint32_t count = 1;
    switch (this->op)
    {
        case BCMOLT_EPON_OAM_PMC_OP_CODE_FIRMWARE_UPDATE:
            {
                count += bcmolt_epon_oam_pmc_file_base_get_packed_length(&this->u.firmware_update.file_info);
            }
            break;
        case BCMOLT_EPON_OAM_PMC_OP_CODE_ACKNOWLEDGE:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_AUTHENTICATE_ONU:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_ENCRYPTION_ENABLE_DISABLE:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_ENCRYPTION_KEY:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_GET_ONU_VERSIONS_REQUEST:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_GET_ONU_VERSIONS_RESPONSE:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_IGMP_SNOOPING_PACKETS:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_MAGIC_NUMBER:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_PHY_LOOP_BACK_CONTROL:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_PING_REQUEST:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_PING_RESPONSE:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_RE_REGISTER:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_REMOTE_ACCESS:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_SET_ALARM_THRESHOLDS:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_THRESHOLD_REPORT_VALUES:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_TURN_ONU_IN_TO_OFF_MODE:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_UNI_PORT_CONFIGURE:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_UNI_PORT_STATUS_REQUEST:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_UNI_PORT_STATUS_RESPONSE:
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_pmc_vendor_extended_base_unpack(bcmolt_epon_oam_pmc_vendor_extended_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_pmc_op_code_unpack(&this->op, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->op)
    {
        case BCMOLT_EPON_OAM_PMC_OP_CODE_FIRMWARE_UPDATE:
            {
                if (!bcmolt_epon_oam_pmc_file_base_unpack(&this->u.firmware_update.file_info, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_PMC_OP_CODE_ACKNOWLEDGE:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_AUTHENTICATE_ONU:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_ENCRYPTION_ENABLE_DISABLE:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_ENCRYPTION_KEY:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_GET_ONU_VERSIONS_REQUEST:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_GET_ONU_VERSIONS_RESPONSE:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_IGMP_SNOOPING_PACKETS:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_MAGIC_NUMBER:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_PHY_LOOP_BACK_CONTROL:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_PING_REQUEST:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_PING_RESPONSE:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_RE_REGISTER:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_REMOTE_ACCESS:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_SET_ALARM_THRESHOLDS:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_THRESHOLD_REPORT_VALUES:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_TURN_ONU_IN_TO_OFF_MODE:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_UNI_PORT_CONFIGURE:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_UNI_PORT_STATUS_REQUEST:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_UNI_PORT_STATUS_RESPONSE:
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_pmc_vendor_extended_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_pmc_op_code op;
    if (!bcmolt_epon_oam_pmc_op_code_unpack(&op, packed))
    {
        return BCMOS_FALSE;
    }

    switch (op)
    {
        case BCMOLT_EPON_OAM_PMC_OP_CODE_FIRMWARE_UPDATE:
            {
                if (!bcmolt_epon_oam_pmc_file_base_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_PMC_OP_CODE_ACKNOWLEDGE:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_AUTHENTICATE_ONU:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_ENCRYPTION_ENABLE_DISABLE:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_ENCRYPTION_KEY:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_GET_ONU_VERSIONS_REQUEST:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_GET_ONU_VERSIONS_RESPONSE:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_IGMP_SNOOPING_PACKETS:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_MAGIC_NUMBER:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_PHY_LOOP_BACK_CONTROL:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_PING_REQUEST:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_PING_RESPONSE:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_RE_REGISTER:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_REMOTE_ACCESS:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_SET_ALARM_THRESHOLDS:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_THRESHOLD_REPORT_VALUES:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_TURN_ONU_IN_TO_OFF_MODE:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_UNI_PORT_CONFIGURE:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_UNI_PORT_STATUS_REQUEST:
        case BCMOLT_EPON_OAM_PMC_OP_CODE_UNI_PORT_STATUS_RESPONSE:
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_vendor_extended_oam_base_pack(bcmolt_epon_oam_vendor_extended_oam_base *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_well_known_oui_pack(this->oui, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->oui)
    {
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_CTC:
            {
                if (!bcmolt_epon_oam_ctc_vendor_extended_base_pack(&this->u.ctc.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_TEK:
            {
                if (!bcmolt_epon_oam_tek_vendor_extended_pack(&this->u.tek.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_PMC:
            {
                if (!bcmolt_epon_oam_pmc_vendor_extended_base_pack(&this->u.pmc.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DPOE:
            {
                if (!bcmolt_epon_oam_dpoe_vendor_extended_base_pack(&this->u.dpoe.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_KT:
            {
                if (!bcmolt_epon_oam_ctc_vendor_extended_base_pack(&this->u.kt.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DASAN:
            {
                if (!bcmolt_epon_oam_dasan_config_base_pack(&this->u.dasan.config, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_BRCM:
            {
                uint32_t preLenFieldPos;
                uint32_t bytesAfterLenField;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.brcm.version))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.brcm.sequence_number))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.brcm.num_total_expected_packets))
                {
                    return BCMOS_FALSE;
                }

                preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

                /* skip over length field (we'll fill it in later) */
                if (!bcmolt_epon_oam_buf_skip(buf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_brcm_oam_pdu_base_pack(&this->u.brcm.pdu, buf))
                {
                    return BCMOS_FALSE;
                }

                bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
                if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u8(buf, bytesAfterLenField))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_SIEPON_A:
            {
                if (!bcmolt_epon_oam_dpoe_vendor_extended_base_pack(&this->u.siepon_a.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
                if ((this->u.def.unknown_count > 0) && (this->u.def.unknown == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"unknown\" of struct \"bcmolt_epon_oam_vendor_extended_oam_base_def\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.def.unknown, this->u.def.unknown_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_vendor_extended_oam_base_get_packed_length(bcmolt_epon_oam_vendor_extended_oam_base *this)
{
    uint32_t count = 3;
    switch (this->oui)
    {
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_CTC:
            {
                count += bcmolt_epon_oam_ctc_vendor_extended_base_get_packed_length(&this->u.ctc.value);
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_TEK:
            {
                count += bcmolt_epon_oam_tek_vendor_extended_get_packed_length(&this->u.tek.value);
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_PMC:
            {
                count += bcmolt_epon_oam_pmc_vendor_extended_base_get_packed_length(&this->u.pmc.value);
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DPOE:
            {
                count += bcmolt_epon_oam_dpoe_vendor_extended_base_get_packed_length(&this->u.dpoe.value);
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_KT:
            {
                count += bcmolt_epon_oam_ctc_vendor_extended_base_get_packed_length(&this->u.kt.value);
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DASAN:
            {
                count += bcmolt_epon_oam_dasan_config_base_get_packed_length(&this->u.dasan.config);
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_BRCM:
            {
                count += 6 + bcmolt_epon_oam_brcm_oam_pdu_base_get_packed_length(&this->u.brcm.pdu);
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_SIEPON_A:
            {
                count += bcmolt_epon_oam_dpoe_vendor_extended_base_get_packed_length(&this->u.siepon_a.value);
            }
            break;
        default:
            {
                count += this->u.def.unknown_count;
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_vendor_extended_oam_base_unpack(bcmolt_epon_oam_vendor_extended_oam_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_well_known_oui_unpack(&this->oui, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->oui)
    {
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_CTC:
            {
                if (!bcmolt_epon_oam_ctc_vendor_extended_base_unpack(&this->u.ctc.value, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_TEK:
            {
                if (!bcmolt_epon_oam_tek_vendor_extended_unpack(&this->u.tek.value, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_PMC:
            {
                if (!bcmolt_epon_oam_pmc_vendor_extended_base_unpack(&this->u.pmc.value, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DPOE:
            {
                if (!bcmolt_epon_oam_dpoe_vendor_extended_base_unpack(&this->u.dpoe.value, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_KT:
            {
                if (!bcmolt_epon_oam_ctc_vendor_extended_base_unpack(&this->u.kt.value, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DASAN:
            {
                if (!bcmolt_epon_oam_dasan_config_base_unpack(&this->u.dasan.config, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_BRCM:
            {
                uint8_t length = 0;
                bcmolt_epon_oam_buf postLenBuf;
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.brcm.version))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.brcm.sequence_number))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.brcm.num_total_expected_packets))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(buf, &length))
                {
                    return BCMOS_FALSE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, length, buf->curr);
                if (!bcmolt_epon_oam_brcm_oam_pdu_base_unpack(&this->u.brcm.pdu, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(buf, length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_SIEPON_A:
            {
                if (!bcmolt_epon_oam_dpoe_vendor_extended_base_unpack(&this->u.siepon_a.value, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
                this->u.def.unknown_count = bcmolt_epon_oam_vendor_extended_oam_base_def_count_unknown(buf);
                if ((this->u.def.unknown_count > 0) && (this->u.def.unknown == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"unknown\" of struct \"bcmolt_epon_oam_vendor_extended_oam_base_def\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.def.unknown = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.def.unknown_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.def.unknown, this->u.def.unknown_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_vendor_extended_oam_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_well_known_oui oui;
    if (!bcmolt_epon_oam_well_known_oui_unpack(&oui, packed))
    {
        return BCMOS_FALSE;
    }

    switch (oui)
    {
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_CTC:
            {
                if (!bcmolt_epon_oam_ctc_vendor_extended_base_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_TEK:
            {
                if (!bcmolt_epon_oam_tek_vendor_extended_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_PMC:
            {
                if (!bcmolt_epon_oam_pmc_vendor_extended_base_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DPOE:
            {
                if (!bcmolt_epon_oam_dpoe_vendor_extended_base_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_KT:
            {
                if (!bcmolt_epon_oam_ctc_vendor_extended_base_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DASAN:
            {
                if (!bcmolt_epon_oam_dasan_config_base_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_BRCM:
            {
                bcmolt_epon_oam_buf postLenBuf;
                uint8_t length;
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
                {
                    return BCMOS_FALSE;
                }

                bcmolt_epon_oam_buf_init(&postLenBuf, length, packed->curr);
                if (!bcmolt_epon_oam_brcm_oam_pdu_base_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_SIEPON_A:
            {
                if (!bcmolt_epon_oam_dpoe_vendor_extended_base_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
                uint32_t unknown_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(packed, 1))
                    {
                        break;
                    }

                    unknown_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(unknown_elem_count * sizeof(uint8_t));
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_vendor_extended_oam_base_def_count_unknown(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_pdu_content_pack(bcmolt_epon_oam_oam_pdu_content *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_oam_opcode_pack(this->code, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->code)
    {
        case BCMOLT_EPON_OAM_OAM_OPCODE_INFO:
            {
                uint32_t i0;
                if ((this->u.info.tlvs_count > 0) && (this->u.info.tlvs == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"tlvs\" of struct \"bcmolt_epon_oam_oam_pdu_content_info\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i0 = 0; i0 < this->u.info.tlvs_count; i0++)
                {
                    if (!bcmolt_epon_oam_info_tlv_base_pack(&this->u.info.tlvs[i0], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_OPCODE_EVENT_NOTIFICATION:
            {
                uint32_t i1;
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.event_notification.sequence_number))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.event_notification.tlvs_count > 0) && (this->u.event_notification.tlvs == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"tlvs\" of struct \"bcmolt_epon_oam_oam_pdu_content_event_notification\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i1 = 0; i1 < this->u.event_notification.tlvs_count; i1++)
                {
                    if (!bcmolt_epon_oam_link_event_tlv_base_pack(&this->u.event_notification.tlvs[i1], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_OPCODE_VAR_REQUEST:
            {
                uint32_t i2;
                if ((this->u.var_request.vars_count > 0) && (this->u.var_request.vars == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vars\" of struct \"bcmolt_epon_oam_oam_pdu_content_var_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i2 = 0; i2 < this->u.var_request.vars_count; i2++)
                {
                    if (!bcmolt_epon_oam_var_descriptor_base_pack(&this->u.var_request.vars[i2], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_OPCODE_VAR_RESPONSE:
            {
                uint32_t i3;
                if ((this->u.var_response.vars_count > 0) && (this->u.var_response.vars == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vars\" of struct \"bcmolt_epon_oam_oam_pdu_content_var_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i3 = 0; i3 < this->u.var_response.vars_count; i3++)
                {
                    if (!bcmolt_epon_oam_var_container_base_pack(&this->u.var_response.vars[i3], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_OPCODE_LOOPBACK_CONTROL:
            {
                if (!bcmolt_epon_oam_remote_loopback_command_pack(this->u.loopback_control.command, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_OPCODE_ORGANIZATION_SPECIFIC:
            {
                if (!bcmolt_epon_oam_vendor_extended_oam_base_pack(&this->u.organization_specific.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_oam_pdu_content_get_packed_length(bcmolt_epon_oam_oam_pdu_content *this)
{
    uint32_t count = 1;
    switch (this->code)
    {
        case BCMOLT_EPON_OAM_OAM_OPCODE_INFO:
            {
                uint32_t i0;
                if ((this->u.info.tlvs_count > 0) && (this->u.info.tlvs == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"tlvs_count\" of struct \"bcmolt_epon_oam_oam_pdu_content\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return 0;
                }

                for (i0 = 0; i0 < this->u.info.tlvs_count; i0++)
                {
                    count += bcmolt_epon_oam_info_tlv_base_get_packed_length(&this->u.info.tlvs[i0]);
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_OPCODE_EVENT_NOTIFICATION:
            {
                uint32_t i1;
                count += 2;
                if ((this->u.event_notification.tlvs_count > 0) && (this->u.event_notification.tlvs == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"tlvs_count\" of struct \"bcmolt_epon_oam_oam_pdu_content\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return 0;
                }

                for (i1 = 0; i1 < this->u.event_notification.tlvs_count; i1++)
                {
                    count += bcmolt_epon_oam_link_event_tlv_base_get_packed_length(&this->u.event_notification.tlvs[i1]);
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_OPCODE_VAR_REQUEST:
            {
                uint32_t i2;
                if ((this->u.var_request.vars_count > 0) && (this->u.var_request.vars == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vars_count\" of struct \"bcmolt_epon_oam_oam_pdu_content\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return 0;
                }

                for (i2 = 0; i2 < this->u.var_request.vars_count; i2++)
                {
                    count += bcmolt_epon_oam_var_descriptor_base_get_packed_length(&this->u.var_request.vars[i2]);
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_OPCODE_VAR_RESPONSE:
            {
                uint32_t i3;
                if ((this->u.var_response.vars_count > 0) && (this->u.var_response.vars == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vars_count\" of struct \"bcmolt_epon_oam_oam_pdu_content\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return 0;
                }

                for (i3 = 0; i3 < this->u.var_response.vars_count; i3++)
                {
                    count += bcmolt_epon_oam_var_container_base_get_packed_length(&this->u.var_response.vars[i3]);
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_OPCODE_LOOPBACK_CONTROL:
            {
                count += 1;
            }
            break;
        case BCMOLT_EPON_OAM_OAM_OPCODE_ORGANIZATION_SPECIFIC:
            {
                count += bcmolt_epon_oam_vendor_extended_oam_base_get_packed_length(&this->u.organization_specific.value);
            }
            break;
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_pdu_content_unpack(bcmolt_epon_oam_oam_pdu_content *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_oam_opcode_unpack(&this->code, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->code)
    {
        case BCMOLT_EPON_OAM_OAM_OPCODE_INFO:
            {
                uint32_t i0;
                this->u.info.tlvs_count = bcmolt_epon_oam_oam_pdu_content_info_count_tlvs(buf);
                if ((this->u.info.tlvs_count > 0) && (this->u.info.tlvs == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"tlvs\" of struct \"bcmolt_epon_oam_oam_pdu_content_info\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.info.tlvs = (bcmolt_epon_oam_info_tlv_base *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.info.tlvs_count * sizeof(bcmolt_epon_oam_info_tlv_base));
                    }
                }

                for (i0 = 0; i0 < this->u.info.tlvs_count; i0++)
                {
                    if (!bcmolt_epon_oam_info_tlv_base_unpack(&this->u.info.tlvs[i0], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_OPCODE_EVENT_NOTIFICATION:
            {
                uint32_t i1;
                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.event_notification.sequence_number))
                {
                    return BCMOS_FALSE;
                }

                this->u.event_notification.tlvs_count = bcmolt_epon_oam_oam_pdu_content_event_notification_count_tlvs(buf);
                if ((this->u.event_notification.tlvs_count > 0) && (this->u.event_notification.tlvs == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"tlvs\" of struct \"bcmolt_epon_oam_oam_pdu_content_event_notification\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.event_notification.tlvs = (bcmolt_epon_oam_link_event_tlv_base *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.event_notification.tlvs_count * sizeof(bcmolt_epon_oam_link_event_tlv_base));
                    }
                }

                for (i1 = 0; i1 < this->u.event_notification.tlvs_count; i1++)
                {
                    if (!bcmolt_epon_oam_link_event_tlv_base_unpack(&this->u.event_notification.tlvs[i1], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_OPCODE_VAR_REQUEST:
            {
                uint32_t i2;
                this->u.var_request.vars_count = bcmolt_epon_oam_oam_pdu_content_var_request_count_vars(buf);
                if ((this->u.var_request.vars_count > 0) && (this->u.var_request.vars == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vars\" of struct \"bcmolt_epon_oam_oam_pdu_content_var_request\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.var_request.vars = (bcmolt_epon_oam_var_descriptor_base *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.var_request.vars_count * sizeof(bcmolt_epon_oam_var_descriptor_base));
                    }
                }

                for (i2 = 0; i2 < this->u.var_request.vars_count; i2++)
                {
                    if (!bcmolt_epon_oam_var_descriptor_base_unpack(&this->u.var_request.vars[i2], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_OPCODE_VAR_RESPONSE:
            {
                uint32_t i3;
                this->u.var_response.vars_count = bcmolt_epon_oam_oam_pdu_content_var_response_count_vars(buf);
                if ((this->u.var_response.vars_count > 0) && (this->u.var_response.vars == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vars\" of struct \"bcmolt_epon_oam_oam_pdu_content_var_response\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.var_response.vars = (bcmolt_epon_oam_var_container_base *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.var_response.vars_count * sizeof(bcmolt_epon_oam_var_container_base));
                    }
                }

                for (i3 = 0; i3 < this->u.var_response.vars_count; i3++)
                {
                    if (!bcmolt_epon_oam_var_container_base_unpack(&this->u.var_response.vars[i3], buf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_OPCODE_LOOPBACK_CONTROL:
            {
                if (!bcmolt_epon_oam_remote_loopback_command_unpack(&this->u.loopback_control.command, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_OPCODE_ORGANIZATION_SPECIFIC:
            {
                if (!bcmolt_epon_oam_vendor_extended_oam_base_unpack(&this->u.organization_specific.value, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_pdu_content_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_oam_opcode code;
    if (!bcmolt_epon_oam_oam_opcode_unpack(&code, packed))
    {
        return BCMOS_FALSE;
    }

    switch (code)
    {
        case BCMOLT_EPON_OAM_OAM_OPCODE_INFO:
            {
                uint32_t tlvs_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_info_tlv_base_scan(packed, extra_mem))
                    {
                        break;
                    }

                    tlvs_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(tlvs_elem_count * sizeof(bcmolt_epon_oam_info_tlv_base));
            }
            break;
        case BCMOLT_EPON_OAM_OAM_OPCODE_EVENT_NOTIFICATION:
            {
                uint32_t tlvs_elem_count = 0;
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_link_event_tlv_base_scan(packed, extra_mem))
                    {
                        break;
                    }

                    tlvs_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(tlvs_elem_count * sizeof(bcmolt_epon_oam_link_event_tlv_base));
            }
            break;
        case BCMOLT_EPON_OAM_OAM_OPCODE_VAR_REQUEST:
            {
                uint32_t vars_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_var_descriptor_base_scan(packed, extra_mem))
                    {
                        break;
                    }

                    vars_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(vars_elem_count * sizeof(bcmolt_epon_oam_var_descriptor_base));
            }
            break;
        case BCMOLT_EPON_OAM_OAM_OPCODE_VAR_RESPONSE:
            {
                uint32_t vars_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_var_container_base_scan(packed, extra_mem))
                    {
                        break;
                    }

                    vars_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(vars_elem_count * sizeof(bcmolt_epon_oam_var_container_base));
            }
            break;
        case BCMOLT_EPON_OAM_OAM_OPCODE_LOOPBACK_CONTROL:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_OPCODE_ORGANIZATION_SPECIFIC:
            {
                if (!bcmolt_epon_oam_vendor_extended_oam_base_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_oam_pdu_content_info_count_tlvs(bcmolt_epon_oam_buf *buf)
{
    uint32_t count = 0;
    uint32_t dummy = 0;
    bcmolt_epon_oam_buf bufClone = *buf;
    while (BCMOS_TRUE)
    {
        if (!bcmolt_epon_oam_info_tlv_base_scan(&bufClone, &dummy))
        {
            break;
        }

        count += 1;
    }

    return count;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_oam_pdu_content_event_notification_count_tlvs(bcmolt_epon_oam_buf *buf)
{
    uint32_t count = 0;
    uint32_t dummy = 0;
    bcmolt_epon_oam_buf bufClone = *buf;
    while (BCMOS_TRUE)
    {
        if (!bcmolt_epon_oam_link_event_tlv_base_scan(&bufClone, &dummy))
        {
            break;
        }

        count += 1;
    }

    return count;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_oam_pdu_content_var_request_count_vars(bcmolt_epon_oam_buf *buf)
{
    uint32_t count = 0;
    uint32_t dummy = 0;
    bcmolt_epon_oam_buf bufClone = *buf;
    while (BCMOS_TRUE)
    {
        if (!bcmolt_epon_oam_var_descriptor_base_scan(&bufClone, &dummy))
        {
            break;
        }

        count += 1;
    }

    return count;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_oam_pdu_content_var_response_count_vars(bcmolt_epon_oam_buf *buf)
{
    uint32_t count = 0;
    uint32_t dummy = 0;
    bcmolt_epon_oam_buf bufClone = *buf;
    while (BCMOS_TRUE)
    {
        if (!bcmolt_epon_oam_var_container_base_scan(&bufClone, &dummy))
        {
            break;
        }

        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_master_end_point_pack(bcmolt_epon_oam_master_end_point *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_master_end_point_type_pack(this->type, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, this->id))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_master_end_point_unpack(bcmolt_epon_oam_master_end_point *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_master_end_point_type_unpack(&this->type, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->id))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_master_end_point_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 2);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_onu_master_oam_content_pack(bcmolt_epon_oam_onu_master_oam_content *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u16(buf, this->link))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_oam_pdu_content_pack(&this->oam_content, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_onu_master_oam_content_get_packed_length(bcmolt_epon_oam_onu_master_oam_content *this)
{
    return 2 + bcmolt_epon_oam_oam_pdu_content_get_packed_length(&this->oam_content);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_onu_master_oam_content_unpack(bcmolt_epon_oam_onu_master_oam_content *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->link))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_oam_pdu_content_unpack(&this->oam_content, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_onu_master_oam_content_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    if (!bcmolt_epon_oam_buf_skip(packed, 2))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_oam_pdu_content_scan(packed, extra_mem))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_info_vendor_oui_pack(bcmolt_epon_oam_oam_reg_info_vendor_oui *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u24(buf, this->oui))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_oam_registration_action_pack(this->action, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->length_reserved))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_info_vendor_oui_unpack(bcmolt_epon_oam_oam_reg_info_vendor_oui *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u24(buf, &this->oui))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_oam_registration_action_unpack(&this->action, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->length_reserved))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_info_vendor_oui_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 6);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_info_vendor_pack(bcmolt_epon_oam_oam_reg_info_vendor *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t preLenFieldPos;
    uint32_t bytesAfterLenField;
    if (!bcmolt_epon_oam_oam_registration_action_pack(this->action, buf))
    {
        return BCMOS_FALSE;
    }

    preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

    /* skip over length field (we'll fill it in later) */
    if (!bcmolt_epon_oam_buf_skip(buf, 2))
    {
        return BCMOS_FALSE;
    }

    switch (this->action)
    {
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_CONT:
            {
                uint8_t i0;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.cont.vendor_oui_reg_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.cont.vendor_oui_reg_count > 0) && (this->u.cont.vendor_oui_reg == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vendor_oui_reg\" of struct \"bcmolt_epon_oam_oam_reg_info_vendor_cont\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i0 = 0; i0 < this->u.cont.vendor_oui_reg_count; i0++)
                {
                    if (!bcmolt_epon_oam_oam_reg_info_vendor_oui_pack(&this->u.cont.vendor_oui_reg[i0], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REG:
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REGISTER_AND_CONTINUE:
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER:
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER_AND_CONTINUE:
        default:
            {
            }
            break;
    }

    bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint16_t));
    if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, bytesAfterLenField))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint16_t))))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_oam_reg_info_vendor_get_packed_length(bcmolt_epon_oam_oam_reg_info_vendor *this)
{
    uint32_t count = 3;
    switch (this->action)
    {
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_CONT:
            {
                count += 1 + (6 * this->u.cont.vendor_oui_reg_count);
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REG:
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REGISTER_AND_CONTINUE:
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER:
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER_AND_CONTINUE:
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_info_vendor_unpack(bcmolt_epon_oam_oam_reg_info_vendor *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint16_t length = 0;
    bcmolt_epon_oam_buf postLenBuf;
    if (!bcmolt_epon_oam_oam_registration_action_unpack(&this->action, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, buf->curr);
    switch (this->action)
    {
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_CONT:
            {
                uint8_t i0;
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.cont.vendor_oui_reg_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.cont.vendor_oui_reg_count > 0) && (this->u.cont.vendor_oui_reg == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vendor_oui_reg\" of struct \"bcmolt_epon_oam_oam_reg_info_vendor_cont\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.cont.vendor_oui_reg = (bcmolt_epon_oam_oam_reg_info_vendor_oui *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.cont.vendor_oui_reg_count * sizeof(bcmolt_epon_oam_oam_reg_info_vendor_oui));
                    }
                }

                for (i0 = 0; i0 < this->u.cont.vendor_oui_reg_count; i0++)
                {
                    if (!bcmolt_epon_oam_oam_reg_info_vendor_oui_unpack(&this->u.cont.vendor_oui_reg[i0], &postLenBuf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REG:
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REGISTER_AND_CONTINUE:
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER:
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER_AND_CONTINUE:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(buf, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_info_vendor_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_oam_registration_action action;
    bcmolt_epon_oam_buf postLenBuf;
    uint16_t length;
    if (!bcmolt_epon_oam_oam_registration_action_unpack(&action, packed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(packed, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, packed->curr);
    switch (action)
    {
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_CONT:
            {
                uint8_t vendor_oui_reg_count;
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &vendor_oui_reg_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_oam_reg_info_vendor_oui) * vendor_oui_reg_count);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, vendor_oui_reg_count * 6))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REG:
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REGISTER_AND_CONTINUE:
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER:
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER_AND_CONTINUE:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_info_tlv_pack(bcmolt_epon_oam_oam_reg_info_tlv *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t preLenFieldPos;
    uint32_t bytesAfterLenField;
    if (!bcmolt_epon_oam_oam_reg_info_type_pack(this->type, buf))
    {
        return BCMOS_FALSE;
    }

    preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

    /* skip over length field (we'll fill it in later) */
    if (!bcmolt_epon_oam_buf_skip(buf, 2))
    {
        return BCMOS_FALSE;
    }

    switch (this->type)
    {
        case BCMOLT_EPON_OAM_OAM_REG_INFO_TYPE_VENDOR:
            {
                if (!bcmolt_epon_oam_oam_reg_info_vendor_pack(&this->u.vendor.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
                if (!bcmolt_epon_oam_oam_registration_action_pack(this->u.def.action, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.def.length_reserved))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint16_t));
    if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, bytesAfterLenField))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint16_t))))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_oam_reg_info_tlv_get_packed_length(bcmolt_epon_oam_oam_reg_info_tlv *this)
{
    uint32_t count = 3;
    switch (this->type)
    {
        case BCMOLT_EPON_OAM_OAM_REG_INFO_TYPE_VENDOR:
            {
                count += bcmolt_epon_oam_oam_reg_info_vendor_get_packed_length(&this->u.vendor.value);
            }
            break;
        default:
            {
                count += 3;
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_info_tlv_unpack(bcmolt_epon_oam_oam_reg_info_tlv *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint16_t length = 0;
    bcmolt_epon_oam_buf postLenBuf;
    if (!bcmolt_epon_oam_oam_reg_info_type_unpack(&this->type, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, buf->curr);
    switch (this->type)
    {
        case BCMOLT_EPON_OAM_OAM_REG_INFO_TYPE_VENDOR:
            {
                if (!bcmolt_epon_oam_oam_reg_info_vendor_unpack(&this->u.vendor.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
                if (!bcmolt_epon_oam_oam_registration_action_unpack(&this->u.def.action, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.def.length_reserved))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(buf, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_info_tlv_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_oam_reg_info_type type;
    bcmolt_epon_oam_buf postLenBuf;
    uint16_t length;
    if (!bcmolt_epon_oam_oam_reg_info_type_unpack(&type, packed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(packed, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, packed->curr);
    switch (type)
    {
        case BCMOLT_EPON_OAM_OAM_REG_INFO_TYPE_VENDOR:
            {
                if (!bcmolt_epon_oam_oam_reg_info_vendor_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_info_cont_pack(bcmolt_epon_oam_oam_reg_info_cont *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t i0;
    if (!bcmolt_epon_oam_buf_write_u8(buf, this->info_reg_count))
    {
        return BCMOS_FALSE;
    }

    if ((this->info_reg_count > 0) && (this->info_reg == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"info_reg\" of struct \"bcmolt_epon_oam_oam_reg_info_cont\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->info_reg_count; i0++)
    {
        if (!bcmolt_epon_oam_oam_reg_info_tlv_pack(&this->info_reg[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_oam_reg_info_cont_get_packed_length(bcmolt_epon_oam_oam_reg_info_cont *this)
{
    uint32_t count = 1;
    uint32_t i0;
    if ((this->info_reg_count > 0) && (this->info_reg == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"info_reg_count\" of struct \"bcmolt_epon_oam_oam_reg_info_cont\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return 0;
    }

    for (i0 = 0; i0 < this->info_reg_count; i0++)
    {
        count += bcmolt_epon_oam_oam_reg_info_tlv_get_packed_length(&this->info_reg[i0]);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_info_cont_unpack(bcmolt_epon_oam_oam_reg_info_cont *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint8_t i0;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->info_reg_count))
    {
        return BCMOS_FALSE;
    }

    if ((this->info_reg_count > 0) && (this->info_reg == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"info_reg\" of struct \"bcmolt_epon_oam_oam_reg_info_cont\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->info_reg = (bcmolt_epon_oam_oam_reg_info_tlv *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->info_reg_count * sizeof(bcmolt_epon_oam_oam_reg_info_tlv));
        }
    }

    for (i0 = 0; i0 < this->info_reg_count; i0++)
    {
        if (!bcmolt_epon_oam_oam_reg_info_tlv_unpack(&this->info_reg[i0], buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_info_cont_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    uint8_t info_reg_count;
    uint8_t i0;
    if (!bcmolt_epon_oam_buf_read_u8(packed, &info_reg_count))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_oam_reg_info_tlv) * info_reg_count);
    for (i0 = 0; i0 < info_reg_count; i0++)
    {
        if (!bcmolt_epon_oam_oam_reg_info_tlv_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_info_pack(bcmolt_epon_oam_oam_reg_info *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t preLenFieldPos;
    uint32_t bytesAfterLenField;
    if (!bcmolt_epon_oam_oam_registration_action_pack(this->action, buf))
    {
        return BCMOS_FALSE;
    }

    preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

    /* skip over length field (we'll fill it in later) */
    if (!bcmolt_epon_oam_buf_skip(buf, 2))
    {
        return BCMOS_FALSE;
    }

    switch (this->action)
    {
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_CONT:
            {
                if (!bcmolt_epon_oam_oam_reg_info_cont_pack(&this->u.cont.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_info_cont_pack(&this->u.register_and_continue.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_info_cont_pack(&this->u.unregister_and_continue.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REG:
            {
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER:
            {
            }
            break;
        default:
            {
            }
            break;
    }

    bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint16_t));
    if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, bytesAfterLenField))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint16_t))))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_oam_reg_info_get_packed_length(bcmolt_epon_oam_oam_reg_info *this)
{
    uint32_t count = 3;
    switch (this->action)
    {
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_CONT:
            {
                count += bcmolt_epon_oam_oam_reg_info_cont_get_packed_length(&this->u.cont.value);
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REGISTER_AND_CONTINUE:
            {
                count += bcmolt_epon_oam_oam_reg_info_cont_get_packed_length(&this->u.register_and_continue.value);
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER_AND_CONTINUE:
            {
                count += bcmolt_epon_oam_oam_reg_info_cont_get_packed_length(&this->u.unregister_and_continue.value);
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REG:
            {
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER:
            {
            }
            break;
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_info_unpack(bcmolt_epon_oam_oam_reg_info *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint16_t length = 0;
    bcmolt_epon_oam_buf postLenBuf;
    if (!bcmolt_epon_oam_oam_registration_action_unpack(&this->action, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, buf->curr);
    switch (this->action)
    {
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_CONT:
            {
                if (!bcmolt_epon_oam_oam_reg_info_cont_unpack(&this->u.cont.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_info_cont_unpack(&this->u.register_and_continue.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_info_cont_unpack(&this->u.unregister_and_continue.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REG:
            {
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER:
            {
            }
            break;
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(buf, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_info_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_oam_registration_action action;
    bcmolt_epon_oam_buf postLenBuf;
    uint16_t length;
    if (!bcmolt_epon_oam_oam_registration_action_unpack(&action, packed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(packed, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, packed->curr);
    switch (action)
    {
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_CONT:
            {
                if (!bcmolt_epon_oam_oam_reg_info_cont_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_info_cont_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_info_cont_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REG:
            {
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER:
            {
            }
            break;
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_ctc_var_desc_pack(bcmolt_epon_oam_oam_reg_ctc_var_desc *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_ctc_branch_pack(this->branch, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->branch)
    {
        case BCMOLT_EPON_OAM_CTC_BRANCH_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_var_leaf_attribute_pack(this->u.attribute.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_ACTION:
            {
                if (!bcmolt_epon_oam_var_leaf_action_pack(this->u.action.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_EXT_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_ctc_leaf_ext_attribute_pack(this->u.ext_attribute.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_EXT_ACTION:
            {
                if (!bcmolt_epon_oam_ctc_leaf_ext_action_pack(this->u.ext_action.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_KTATTRIBUTE:
            {
                if (!bcmolt_epon_oam_ktleaf_attribute_pack(this->u.ktattribute.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_KTACTION:
            {
                if (!bcmolt_epon_oam_ktleaf_action_pack(this->u.ktaction.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_END:
        case BCMOLT_EPON_OAM_CTC_BRANCH_MANAGEMENT_OBJECT:
        case BCMOLT_EPON_OAM_CTC_BRANCH_OLD_MANAGEMENT_OBJECT:
        default:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.def.leaf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_ctc_var_desc_unpack(bcmolt_epon_oam_oam_reg_ctc_var_desc *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_ctc_branch_unpack(&this->branch, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->branch)
    {
        case BCMOLT_EPON_OAM_CTC_BRANCH_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_var_leaf_attribute_unpack(&this->u.attribute.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_ACTION:
            {
                if (!bcmolt_epon_oam_var_leaf_action_unpack(&this->u.action.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_EXT_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_ctc_leaf_ext_attribute_unpack(&this->u.ext_attribute.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_EXT_ACTION:
            {
                if (!bcmolt_epon_oam_ctc_leaf_ext_action_unpack(&this->u.ext_action.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_KTATTRIBUTE:
            {
                if (!bcmolt_epon_oam_ktleaf_attribute_unpack(&this->u.ktattribute.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_KTACTION:
            {
                if (!bcmolt_epon_oam_ktleaf_action_unpack(&this->u.ktaction.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_BRANCH_END:
        case BCMOLT_EPON_OAM_CTC_BRANCH_MANAGEMENT_OBJECT:
        case BCMOLT_EPON_OAM_CTC_BRANCH_OLD_MANAGEMENT_OBJECT:
        default:
            {
                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.def.leaf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_ctc_var_desc_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 3);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_ctc_variable_pack(bcmolt_epon_oam_oam_reg_ctc_variable *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_oam_reg_ctc_var_desc_pack(&this->descriptor, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_oam_registration_action_pack(this->action, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->length_reserved))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_ctc_variable_unpack(bcmolt_epon_oam_oam_reg_ctc_variable *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_oam_reg_ctc_var_desc_unpack(&this->descriptor, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_oam_registration_action_unpack(&this->action, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->length_reserved))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_ctc_variable_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 6);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_ctc_variable_list_pack(bcmolt_epon_oam_oam_reg_ctc_variable_list *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t i0;
    if (!bcmolt_epon_oam_buf_write_u8(buf, this->variable_count))
    {
        return BCMOS_FALSE;
    }

    if ((this->variable_count > 0) && (this->variables == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"variables\" of struct \"bcmolt_epon_oam_oam_reg_ctc_variable_list\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->variable_count; i0++)
    {
        if (!bcmolt_epon_oam_oam_reg_ctc_variable_pack(&this->variables[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_oam_reg_ctc_variable_list_get_packed_length(bcmolt_epon_oam_oam_reg_ctc_variable_list *this)
{
    return 1 + (6 * this->variable_count);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_ctc_variable_list_unpack(bcmolt_epon_oam_oam_reg_ctc_variable_list *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint8_t i0;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->variable_count))
    {
        return BCMOS_FALSE;
    }

    if ((this->variable_count > 0) && (this->variables == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"variables\" of struct \"bcmolt_epon_oam_oam_reg_ctc_variable_list\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->variables = (bcmolt_epon_oam_oam_reg_ctc_variable *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->variable_count * sizeof(bcmolt_epon_oam_oam_reg_ctc_variable));
        }
    }

    for (i0 = 0; i0 < this->variable_count; i0++)
    {
        if (!bcmolt_epon_oam_oam_reg_ctc_variable_unpack(&this->variables[i0], buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_ctc_variable_list_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    uint8_t variable_count;
    if (!bcmolt_epon_oam_buf_read_u8(packed, &variable_count))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_oam_reg_ctc_variable) * variable_count);
    if (!bcmolt_epon_oam_buf_skip(packed, variable_count * 6))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_ctc_op_variable_pack(bcmolt_epon_oam_oam_reg_ctc_op_variable *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t preLenFieldPos;
    uint32_t bytesAfterLenField;
    if (!bcmolt_epon_oam_oam_registration_action_pack(this->action, buf))
    {
        return BCMOS_FALSE;
    }

    preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

    /* skip over length field (we'll fill it in later) */
    if (!bcmolt_epon_oam_buf_skip(buf, 2))
    {
        return BCMOS_FALSE;
    }

    switch (this->action)
    {
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_CONT:
            {
                if (!bcmolt_epon_oam_oam_reg_ctc_variable_list_pack(&this->u.cont.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_ctc_variable_list_pack(&this->u.register_and_continue.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_ctc_variable_list_pack(&this->u.unregister_and_continue.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REG:
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER:
        default:
            {
            }
            break;
    }

    bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint16_t));
    if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, bytesAfterLenField))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint16_t))))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_oam_reg_ctc_op_variable_get_packed_length(bcmolt_epon_oam_oam_reg_ctc_op_variable *this)
{
    uint32_t count = 3;
    switch (this->action)
    {
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_CONT:
            {
                count += bcmolt_epon_oam_oam_reg_ctc_variable_list_get_packed_length(&this->u.cont.value);
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REGISTER_AND_CONTINUE:
            {
                count += bcmolt_epon_oam_oam_reg_ctc_variable_list_get_packed_length(&this->u.register_and_continue.value);
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER_AND_CONTINUE:
            {
                count += bcmolt_epon_oam_oam_reg_ctc_variable_list_get_packed_length(&this->u.unregister_and_continue.value);
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REG:
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER:
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_ctc_op_variable_unpack(bcmolt_epon_oam_oam_reg_ctc_op_variable *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint16_t length = 0;
    bcmolt_epon_oam_buf postLenBuf;
    if (!bcmolt_epon_oam_oam_registration_action_unpack(&this->action, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, buf->curr);
    switch (this->action)
    {
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_CONT:
            {
                if (!bcmolt_epon_oam_oam_reg_ctc_variable_list_unpack(&this->u.cont.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_ctc_variable_list_unpack(&this->u.register_and_continue.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_ctc_variable_list_unpack(&this->u.unregister_and_continue.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REG:
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(buf, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_ctc_op_variable_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_oam_registration_action action;
    bcmolt_epon_oam_buf postLenBuf;
    uint16_t length;
    if (!bcmolt_epon_oam_oam_registration_action_unpack(&action, packed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(packed, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, packed->curr);
    switch (action)
    {
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_CONT:
            {
                if (!bcmolt_epon_oam_oam_reg_ctc_variable_list_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_ctc_variable_list_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_ctc_variable_list_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REG:
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_ctc_opcode_pack(bcmolt_epon_oam_oam_reg_ctc_opcode *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t preLenFieldPos;
    uint32_t bytesAfterLenField;
    if (!bcmolt_epon_oam_ctc_opcode_pack(this->opcode, buf))
    {
        return BCMOS_FALSE;
    }

    preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

    /* skip over length field (we'll fill it in later) */
    if (!bcmolt_epon_oam_buf_skip(buf, 2))
    {
        return BCMOS_FALSE;
    }

    switch (this->opcode)
    {
        case BCMOLT_EPON_OAM_CTC_OPCODE_GET_REQUEST:
            {
                if (!bcmolt_epon_oam_oam_reg_ctc_op_variable_pack(&this->u.get_request.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_OPCODE_SET_REQUEST:
            {
                if (!bcmolt_epon_oam_oam_reg_ctc_op_variable_pack(&this->u.set_request.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_OPCODE_CHURNING:
        case BCMOLT_EPON_OAM_CTC_OPCODE_DBA:
        case BCMOLT_EPON_OAM_CTC_OPCODE_EVENT:
        case BCMOLT_EPON_OAM_CTC_OPCODE_GET_RESPONSE:
        case BCMOLT_EPON_OAM_CTC_OPCODE_KTONU_EVENT:
        case BCMOLT_EPON_OAM_CTC_OPCODE_ONU_AUTHENTICATION:
        case BCMOLT_EPON_OAM_CTC_OPCODE_SET_RESPONSE:
        case BCMOLT_EPON_OAM_CTC_OPCODE_SOFTWARE_DOWNLOAD:
        default:
            {
                if (!bcmolt_epon_oam_oam_registration_action_pack(this->u.def.action, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.def.length_reserved))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint16_t));
    if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, bytesAfterLenField))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint16_t))))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_oam_reg_ctc_opcode_get_packed_length(bcmolt_epon_oam_oam_reg_ctc_opcode *this)
{
    uint32_t count = 3;
    switch (this->opcode)
    {
        case BCMOLT_EPON_OAM_CTC_OPCODE_GET_REQUEST:
            {
                count += bcmolt_epon_oam_oam_reg_ctc_op_variable_get_packed_length(&this->u.get_request.value);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_OPCODE_SET_REQUEST:
            {
                count += bcmolt_epon_oam_oam_reg_ctc_op_variable_get_packed_length(&this->u.set_request.value);
            }
            break;
        case BCMOLT_EPON_OAM_CTC_OPCODE_CHURNING:
        case BCMOLT_EPON_OAM_CTC_OPCODE_DBA:
        case BCMOLT_EPON_OAM_CTC_OPCODE_EVENT:
        case BCMOLT_EPON_OAM_CTC_OPCODE_GET_RESPONSE:
        case BCMOLT_EPON_OAM_CTC_OPCODE_KTONU_EVENT:
        case BCMOLT_EPON_OAM_CTC_OPCODE_ONU_AUTHENTICATION:
        case BCMOLT_EPON_OAM_CTC_OPCODE_SET_RESPONSE:
        case BCMOLT_EPON_OAM_CTC_OPCODE_SOFTWARE_DOWNLOAD:
        default:
            {
                count += 3;
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_ctc_opcode_unpack(bcmolt_epon_oam_oam_reg_ctc_opcode *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint16_t length = 0;
    bcmolt_epon_oam_buf postLenBuf;
    if (!bcmolt_epon_oam_ctc_opcode_unpack(&this->opcode, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, buf->curr);
    switch (this->opcode)
    {
        case BCMOLT_EPON_OAM_CTC_OPCODE_GET_REQUEST:
            {
                if (!bcmolt_epon_oam_oam_reg_ctc_op_variable_unpack(&this->u.get_request.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_OPCODE_SET_REQUEST:
            {
                if (!bcmolt_epon_oam_oam_reg_ctc_op_variable_unpack(&this->u.set_request.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_OPCODE_CHURNING:
        case BCMOLT_EPON_OAM_CTC_OPCODE_DBA:
        case BCMOLT_EPON_OAM_CTC_OPCODE_EVENT:
        case BCMOLT_EPON_OAM_CTC_OPCODE_GET_RESPONSE:
        case BCMOLT_EPON_OAM_CTC_OPCODE_KTONU_EVENT:
        case BCMOLT_EPON_OAM_CTC_OPCODE_ONU_AUTHENTICATION:
        case BCMOLT_EPON_OAM_CTC_OPCODE_SET_RESPONSE:
        case BCMOLT_EPON_OAM_CTC_OPCODE_SOFTWARE_DOWNLOAD:
        default:
            {
                if (!bcmolt_epon_oam_oam_registration_action_unpack(&this->u.def.action, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.def.length_reserved))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(buf, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_ctc_opcode_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_ctc_opcode opcode;
    bcmolt_epon_oam_buf postLenBuf;
    uint16_t length;
    if (!bcmolt_epon_oam_ctc_opcode_unpack(&opcode, packed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(packed, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, packed->curr);
    switch (opcode)
    {
        case BCMOLT_EPON_OAM_CTC_OPCODE_GET_REQUEST:
            {
                if (!bcmolt_epon_oam_oam_reg_ctc_op_variable_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_OPCODE_SET_REQUEST:
            {
                if (!bcmolt_epon_oam_oam_reg_ctc_op_variable_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_CTC_OPCODE_CHURNING:
        case BCMOLT_EPON_OAM_CTC_OPCODE_DBA:
        case BCMOLT_EPON_OAM_CTC_OPCODE_EVENT:
        case BCMOLT_EPON_OAM_CTC_OPCODE_GET_RESPONSE:
        case BCMOLT_EPON_OAM_CTC_OPCODE_KTONU_EVENT:
        case BCMOLT_EPON_OAM_CTC_OPCODE_ONU_AUTHENTICATION:
        case BCMOLT_EPON_OAM_CTC_OPCODE_SET_RESPONSE:
        case BCMOLT_EPON_OAM_CTC_OPCODE_SOFTWARE_DOWNLOAD:
        default:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_ctc_cont_pack(bcmolt_epon_oam_oam_reg_ctc_cont *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t i0;
    if (!bcmolt_epon_oam_buf_write_u8(buf, this->opcode_count))
    {
        return BCMOS_FALSE;
    }

    if ((this->opcode_count > 0) && (this->opcodes == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"opcodes\" of struct \"bcmolt_epon_oam_oam_reg_ctc_cont\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->opcode_count; i0++)
    {
        if (!bcmolt_epon_oam_oam_reg_ctc_opcode_pack(&this->opcodes[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_oam_reg_ctc_cont_get_packed_length(bcmolt_epon_oam_oam_reg_ctc_cont *this)
{
    uint32_t count = 1;
    uint32_t i0;
    if ((this->opcode_count > 0) && (this->opcodes == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"opcode_count\" of struct \"bcmolt_epon_oam_oam_reg_ctc_cont\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return 0;
    }

    for (i0 = 0; i0 < this->opcode_count; i0++)
    {
        count += bcmolt_epon_oam_oam_reg_ctc_opcode_get_packed_length(&this->opcodes[i0]);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_ctc_cont_unpack(bcmolt_epon_oam_oam_reg_ctc_cont *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint8_t i0;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->opcode_count))
    {
        return BCMOS_FALSE;
    }

    if ((this->opcode_count > 0) && (this->opcodes == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"opcodes\" of struct \"bcmolt_epon_oam_oam_reg_ctc_cont\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->opcodes = (bcmolt_epon_oam_oam_reg_ctc_opcode *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->opcode_count * sizeof(bcmolt_epon_oam_oam_reg_ctc_opcode));
        }
    }

    for (i0 = 0; i0 < this->opcode_count; i0++)
    {
        if (!bcmolt_epon_oam_oam_reg_ctc_opcode_unpack(&this->opcodes[i0], buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_ctc_cont_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    uint8_t opcode_count;
    uint8_t i0;
    if (!bcmolt_epon_oam_buf_read_u8(packed, &opcode_count))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_oam_reg_ctc_opcode) * opcode_count);
    for (i0 = 0; i0 < opcode_count; i0++)
    {
        if (!bcmolt_epon_oam_oam_reg_ctc_opcode_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_ctc_pack(bcmolt_epon_oam_oam_reg_ctc *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t preLenFieldPos;
    uint32_t bytesAfterLenField;
    if (!bcmolt_epon_oam_oam_registration_action_pack(this->action, buf))
    {
        return BCMOS_FALSE;
    }

    preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

    /* skip over length field (we'll fill it in later) */
    if (!bcmolt_epon_oam_buf_skip(buf, 2))
    {
        return BCMOS_FALSE;
    }

    switch (this->action)
    {
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_CONT:
            {
                if (!bcmolt_epon_oam_oam_reg_ctc_cont_pack(&this->u.cont.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_ctc_cont_pack(&this->u.register_and_continue.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_ctc_cont_pack(&this->u.unregister_and_continue.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REG:
            {
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER:
            {
            }
            break;
        default:
            {
            }
            break;
    }

    bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint16_t));
    if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, bytesAfterLenField))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint16_t))))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_oam_reg_ctc_get_packed_length(bcmolt_epon_oam_oam_reg_ctc *this)
{
    uint32_t count = 3;
    switch (this->action)
    {
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_CONT:
            {
                count += bcmolt_epon_oam_oam_reg_ctc_cont_get_packed_length(&this->u.cont.value);
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REGISTER_AND_CONTINUE:
            {
                count += bcmolt_epon_oam_oam_reg_ctc_cont_get_packed_length(&this->u.register_and_continue.value);
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER_AND_CONTINUE:
            {
                count += bcmolt_epon_oam_oam_reg_ctc_cont_get_packed_length(&this->u.unregister_and_continue.value);
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REG:
            {
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER:
            {
            }
            break;
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_ctc_unpack(bcmolt_epon_oam_oam_reg_ctc *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint16_t length = 0;
    bcmolt_epon_oam_buf postLenBuf;
    if (!bcmolt_epon_oam_oam_registration_action_unpack(&this->action, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, buf->curr);
    switch (this->action)
    {
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_CONT:
            {
                if (!bcmolt_epon_oam_oam_reg_ctc_cont_unpack(&this->u.cont.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_ctc_cont_unpack(&this->u.register_and_continue.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_ctc_cont_unpack(&this->u.unregister_and_continue.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REG:
            {
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER:
            {
            }
            break;
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(buf, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_ctc_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_oam_registration_action action;
    bcmolt_epon_oam_buf postLenBuf;
    uint16_t length;
    if (!bcmolt_epon_oam_oam_registration_action_unpack(&action, packed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(packed, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, packed->curr);
    switch (action)
    {
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_CONT:
            {
                if (!bcmolt_epon_oam_oam_reg_ctc_cont_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_ctc_cont_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_ctc_cont_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REG:
            {
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER:
            {
            }
            break;
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_tek_var_desc_pack(bcmolt_epon_oam_oam_reg_tek_var_desc *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_tek_branch_pack(this->branch, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->branch)
    {
        case BCMOLT_EPON_OAM_TEK_BRANCH_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_tek_leaf_attribute_pack(this->u.attribute.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_ACTION:
            {
                if (!bcmolt_epon_oam_tek_leaf_action_pack(this->u.action.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_END:
        case BCMOLT_EPON_OAM_TEK_BRANCH_NAME_BINDING:
        case BCMOLT_EPON_OAM_TEK_BRANCH_OBJECT:
        case BCMOLT_EPON_OAM_TEK_BRANCH_PACKAGE:
        default:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.def.leaf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_tek_var_desc_unpack(bcmolt_epon_oam_oam_reg_tek_var_desc *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_tek_branch_unpack(&this->branch, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->branch)
    {
        case BCMOLT_EPON_OAM_TEK_BRANCH_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_tek_leaf_attribute_unpack(&this->u.attribute.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_ACTION:
            {
                if (!bcmolt_epon_oam_tek_leaf_action_unpack(&this->u.action.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_BRANCH_END:
        case BCMOLT_EPON_OAM_TEK_BRANCH_NAME_BINDING:
        case BCMOLT_EPON_OAM_TEK_BRANCH_OBJECT:
        case BCMOLT_EPON_OAM_TEK_BRANCH_PACKAGE:
        default:
            {
                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.def.leaf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_tek_var_desc_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 3);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_tek_variable_pack(bcmolt_epon_oam_oam_reg_tek_variable *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_oam_reg_tek_var_desc_pack(&this->descriptor, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_oam_registration_action_pack(this->action, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->length_reserved))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_tek_variable_unpack(bcmolt_epon_oam_oam_reg_tek_variable *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_oam_reg_tek_var_desc_unpack(&this->descriptor, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_oam_registration_action_unpack(&this->action, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->length_reserved))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_tek_variable_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 6);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_tek_variable_list_pack(bcmolt_epon_oam_oam_reg_tek_variable_list *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t i0;
    if (!bcmolt_epon_oam_buf_write_u8(buf, this->variable_count))
    {
        return BCMOS_FALSE;
    }

    if ((this->variable_count > 0) && (this->variables == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"variables\" of struct \"bcmolt_epon_oam_oam_reg_tek_variable_list\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->variable_count; i0++)
    {
        if (!bcmolt_epon_oam_oam_reg_tek_variable_pack(&this->variables[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_oam_reg_tek_variable_list_get_packed_length(bcmolt_epon_oam_oam_reg_tek_variable_list *this)
{
    return 1 + (6 * this->variable_count);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_tek_variable_list_unpack(bcmolt_epon_oam_oam_reg_tek_variable_list *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint8_t i0;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->variable_count))
    {
        return BCMOS_FALSE;
    }

    if ((this->variable_count > 0) && (this->variables == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"variables\" of struct \"bcmolt_epon_oam_oam_reg_tek_variable_list\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->variables = (bcmolt_epon_oam_oam_reg_tek_variable *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->variable_count * sizeof(bcmolt_epon_oam_oam_reg_tek_variable));
        }
    }

    for (i0 = 0; i0 < this->variable_count; i0++)
    {
        if (!bcmolt_epon_oam_oam_reg_tek_variable_unpack(&this->variables[i0], buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_tek_variable_list_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    uint8_t variable_count;
    if (!bcmolt_epon_oam_buf_read_u8(packed, &variable_count))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_oam_reg_tek_variable) * variable_count);
    if (!bcmolt_epon_oam_buf_skip(packed, variable_count * 6))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_tek_op_variable_pack(bcmolt_epon_oam_oam_reg_tek_op_variable *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t preLenFieldPos;
    uint32_t bytesAfterLenField;
    if (!bcmolt_epon_oam_oam_registration_action_pack(this->action, buf))
    {
        return BCMOS_FALSE;
    }

    preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

    /* skip over length field (we'll fill it in later) */
    if (!bcmolt_epon_oam_buf_skip(buf, 2))
    {
        return BCMOS_FALSE;
    }

    switch (this->action)
    {
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_CONT:
            {
                if (!bcmolt_epon_oam_oam_reg_tek_variable_list_pack(&this->u.cont.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_tek_variable_list_pack(&this->u.register_and_continue.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_tek_variable_list_pack(&this->u.unregister_and_continue.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REG:
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER:
        default:
            {
            }
            break;
    }

    bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint16_t));
    if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, bytesAfterLenField))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint16_t))))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_oam_reg_tek_op_variable_get_packed_length(bcmolt_epon_oam_oam_reg_tek_op_variable *this)
{
    uint32_t count = 3;
    switch (this->action)
    {
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_CONT:
            {
                count += bcmolt_epon_oam_oam_reg_tek_variable_list_get_packed_length(&this->u.cont.value);
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REGISTER_AND_CONTINUE:
            {
                count += bcmolt_epon_oam_oam_reg_tek_variable_list_get_packed_length(&this->u.register_and_continue.value);
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER_AND_CONTINUE:
            {
                count += bcmolt_epon_oam_oam_reg_tek_variable_list_get_packed_length(&this->u.unregister_and_continue.value);
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REG:
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER:
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_tek_op_variable_unpack(bcmolt_epon_oam_oam_reg_tek_op_variable *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint16_t length = 0;
    bcmolt_epon_oam_buf postLenBuf;
    if (!bcmolt_epon_oam_oam_registration_action_unpack(&this->action, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, buf->curr);
    switch (this->action)
    {
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_CONT:
            {
                if (!bcmolt_epon_oam_oam_reg_tek_variable_list_unpack(&this->u.cont.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_tek_variable_list_unpack(&this->u.register_and_continue.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_tek_variable_list_unpack(&this->u.unregister_and_continue.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REG:
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(buf, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_tek_op_variable_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_oam_registration_action action;
    bcmolt_epon_oam_buf postLenBuf;
    uint16_t length;
    if (!bcmolt_epon_oam_oam_registration_action_unpack(&action, packed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(packed, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, packed->curr);
    switch (action)
    {
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_CONT:
            {
                if (!bcmolt_epon_oam_oam_reg_tek_variable_list_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_tek_variable_list_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_tek_variable_list_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REG:
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_tek_opcode_pack(bcmolt_epon_oam_oam_reg_tek_opcode *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t preLenFieldPos;
    uint32_t bytesAfterLenField;
    if (!bcmolt_epon_oam_tek_opcode_pack(this->opcode, buf))
    {
        return BCMOS_FALSE;
    }

    preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

    /* skip over length field (we'll fill it in later) */
    if (!bcmolt_epon_oam_buf_skip(buf, 2))
    {
        return BCMOS_FALSE;
    }

    switch (this->opcode)
    {
        case BCMOLT_EPON_OAM_TEK_OPCODE_GET_REQUEST:
            {
                if (!bcmolt_epon_oam_oam_reg_tek_op_variable_pack(&this->u.get_request.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_SET_REQUEST:
            {
                if (!bcmolt_epon_oam_oam_reg_tek_op_variable_pack(&this->u.set_request.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_FILE_ACK:
        case BCMOLT_EPON_OAM_TEK_OPCODE_FILE_DATA:
        case BCMOLT_EPON_OAM_TEK_OPCODE_FILE_READ_REQUEST:
        case BCMOLT_EPON_OAM_TEK_OPCODE_FILE_WRITE_REQUEST:
        case BCMOLT_EPON_OAM_TEK_OPCODE_GET_RESPONSE:
        case BCMOLT_EPON_OAM_TEK_OPCODE_I2C_BSC_READ_REQUEST:
        case BCMOLT_EPON_OAM_TEK_OPCODE_I2C_BSC_READ_RESPONSE:
        case BCMOLT_EPON_OAM_TEK_OPCODE_I2C_BSC_WRITE_REQUEST:
        case BCMOLT_EPON_OAM_TEK_OPCODE_I2C_BSC_WRITE_RESPONSE:
        case BCMOLT_EPON_OAM_TEK_OPCODE_INFO:
        case BCMOLT_EPON_OAM_TEK_OPCODE_KEY_EXCHANGE:
        case BCMOLT_EPON_OAM_TEK_OPCODE_LOOP_DETECT:
        case BCMOLT_EPON_OAM_TEK_OPCODE_MULTICAST_REGISTER:
        case BCMOLT_EPON_OAM_TEK_OPCODE_MULTICAST_REGISTER_RESPONSE:
        case BCMOLT_EPON_OAM_TEK_OPCODE_MULTICAST_REQUEST:
        case BCMOLT_EPON_OAM_TEK_OPCODE_SET_RESPONSE:
        case BCMOLT_EPON_OAM_TEK_OPCODE_UNACKED_ACTION:
        default:
            {
                if (!bcmolt_epon_oam_oam_registration_action_pack(this->u.def.action, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.def.length_reserved))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint16_t));
    if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, bytesAfterLenField))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint16_t))))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_oam_reg_tek_opcode_get_packed_length(bcmolt_epon_oam_oam_reg_tek_opcode *this)
{
    uint32_t count = 3;
    switch (this->opcode)
    {
        case BCMOLT_EPON_OAM_TEK_OPCODE_GET_REQUEST:
            {
                count += bcmolt_epon_oam_oam_reg_tek_op_variable_get_packed_length(&this->u.get_request.value);
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_SET_REQUEST:
            {
                count += bcmolt_epon_oam_oam_reg_tek_op_variable_get_packed_length(&this->u.set_request.value);
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_FILE_ACK:
        case BCMOLT_EPON_OAM_TEK_OPCODE_FILE_DATA:
        case BCMOLT_EPON_OAM_TEK_OPCODE_FILE_READ_REQUEST:
        case BCMOLT_EPON_OAM_TEK_OPCODE_FILE_WRITE_REQUEST:
        case BCMOLT_EPON_OAM_TEK_OPCODE_GET_RESPONSE:
        case BCMOLT_EPON_OAM_TEK_OPCODE_I2C_BSC_READ_REQUEST:
        case BCMOLT_EPON_OAM_TEK_OPCODE_I2C_BSC_READ_RESPONSE:
        case BCMOLT_EPON_OAM_TEK_OPCODE_I2C_BSC_WRITE_REQUEST:
        case BCMOLT_EPON_OAM_TEK_OPCODE_I2C_BSC_WRITE_RESPONSE:
        case BCMOLT_EPON_OAM_TEK_OPCODE_INFO:
        case BCMOLT_EPON_OAM_TEK_OPCODE_KEY_EXCHANGE:
        case BCMOLT_EPON_OAM_TEK_OPCODE_LOOP_DETECT:
        case BCMOLT_EPON_OAM_TEK_OPCODE_MULTICAST_REGISTER:
        case BCMOLT_EPON_OAM_TEK_OPCODE_MULTICAST_REGISTER_RESPONSE:
        case BCMOLT_EPON_OAM_TEK_OPCODE_MULTICAST_REQUEST:
        case BCMOLT_EPON_OAM_TEK_OPCODE_SET_RESPONSE:
        case BCMOLT_EPON_OAM_TEK_OPCODE_UNACKED_ACTION:
        default:
            {
                count += 3;
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_tek_opcode_unpack(bcmolt_epon_oam_oam_reg_tek_opcode *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint16_t length = 0;
    bcmolt_epon_oam_buf postLenBuf;
    if (!bcmolt_epon_oam_tek_opcode_unpack(&this->opcode, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, buf->curr);
    switch (this->opcode)
    {
        case BCMOLT_EPON_OAM_TEK_OPCODE_GET_REQUEST:
            {
                if (!bcmolt_epon_oam_oam_reg_tek_op_variable_unpack(&this->u.get_request.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_SET_REQUEST:
            {
                if (!bcmolt_epon_oam_oam_reg_tek_op_variable_unpack(&this->u.set_request.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_FILE_ACK:
        case BCMOLT_EPON_OAM_TEK_OPCODE_FILE_DATA:
        case BCMOLT_EPON_OAM_TEK_OPCODE_FILE_READ_REQUEST:
        case BCMOLT_EPON_OAM_TEK_OPCODE_FILE_WRITE_REQUEST:
        case BCMOLT_EPON_OAM_TEK_OPCODE_GET_RESPONSE:
        case BCMOLT_EPON_OAM_TEK_OPCODE_I2C_BSC_READ_REQUEST:
        case BCMOLT_EPON_OAM_TEK_OPCODE_I2C_BSC_READ_RESPONSE:
        case BCMOLT_EPON_OAM_TEK_OPCODE_I2C_BSC_WRITE_REQUEST:
        case BCMOLT_EPON_OAM_TEK_OPCODE_I2C_BSC_WRITE_RESPONSE:
        case BCMOLT_EPON_OAM_TEK_OPCODE_INFO:
        case BCMOLT_EPON_OAM_TEK_OPCODE_KEY_EXCHANGE:
        case BCMOLT_EPON_OAM_TEK_OPCODE_LOOP_DETECT:
        case BCMOLT_EPON_OAM_TEK_OPCODE_MULTICAST_REGISTER:
        case BCMOLT_EPON_OAM_TEK_OPCODE_MULTICAST_REGISTER_RESPONSE:
        case BCMOLT_EPON_OAM_TEK_OPCODE_MULTICAST_REQUEST:
        case BCMOLT_EPON_OAM_TEK_OPCODE_SET_RESPONSE:
        case BCMOLT_EPON_OAM_TEK_OPCODE_UNACKED_ACTION:
        default:
            {
                if (!bcmolt_epon_oam_oam_registration_action_unpack(&this->u.def.action, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.def.length_reserved))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(buf, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_tek_opcode_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_tek_opcode opcode;
    bcmolt_epon_oam_buf postLenBuf;
    uint16_t length;
    if (!bcmolt_epon_oam_tek_opcode_unpack(&opcode, packed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(packed, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, packed->curr);
    switch (opcode)
    {
        case BCMOLT_EPON_OAM_TEK_OPCODE_GET_REQUEST:
            {
                if (!bcmolt_epon_oam_oam_reg_tek_op_variable_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_SET_REQUEST:
            {
                if (!bcmolt_epon_oam_oam_reg_tek_op_variable_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_OPCODE_FILE_ACK:
        case BCMOLT_EPON_OAM_TEK_OPCODE_FILE_DATA:
        case BCMOLT_EPON_OAM_TEK_OPCODE_FILE_READ_REQUEST:
        case BCMOLT_EPON_OAM_TEK_OPCODE_FILE_WRITE_REQUEST:
        case BCMOLT_EPON_OAM_TEK_OPCODE_GET_RESPONSE:
        case BCMOLT_EPON_OAM_TEK_OPCODE_I2C_BSC_READ_REQUEST:
        case BCMOLT_EPON_OAM_TEK_OPCODE_I2C_BSC_READ_RESPONSE:
        case BCMOLT_EPON_OAM_TEK_OPCODE_I2C_BSC_WRITE_REQUEST:
        case BCMOLT_EPON_OAM_TEK_OPCODE_I2C_BSC_WRITE_RESPONSE:
        case BCMOLT_EPON_OAM_TEK_OPCODE_INFO:
        case BCMOLT_EPON_OAM_TEK_OPCODE_KEY_EXCHANGE:
        case BCMOLT_EPON_OAM_TEK_OPCODE_LOOP_DETECT:
        case BCMOLT_EPON_OAM_TEK_OPCODE_MULTICAST_REGISTER:
        case BCMOLT_EPON_OAM_TEK_OPCODE_MULTICAST_REGISTER_RESPONSE:
        case BCMOLT_EPON_OAM_TEK_OPCODE_MULTICAST_REQUEST:
        case BCMOLT_EPON_OAM_TEK_OPCODE_SET_RESPONSE:
        case BCMOLT_EPON_OAM_TEK_OPCODE_UNACKED_ACTION:
        default:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_tek_cont_pack(bcmolt_epon_oam_oam_reg_tek_cont *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t i0;
    if (!bcmolt_epon_oam_buf_write_u8(buf, this->opcode_count))
    {
        return BCMOS_FALSE;
    }

    if ((this->opcode_count > 0) && (this->opcodes == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"opcodes\" of struct \"bcmolt_epon_oam_oam_reg_tek_cont\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->opcode_count; i0++)
    {
        if (!bcmolt_epon_oam_oam_reg_tek_opcode_pack(&this->opcodes[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_oam_reg_tek_cont_get_packed_length(bcmolt_epon_oam_oam_reg_tek_cont *this)
{
    uint32_t count = 1;
    uint32_t i0;
    if ((this->opcode_count > 0) && (this->opcodes == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"opcode_count\" of struct \"bcmolt_epon_oam_oam_reg_tek_cont\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return 0;
    }

    for (i0 = 0; i0 < this->opcode_count; i0++)
    {
        count += bcmolt_epon_oam_oam_reg_tek_opcode_get_packed_length(&this->opcodes[i0]);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_tek_cont_unpack(bcmolt_epon_oam_oam_reg_tek_cont *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint8_t i0;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->opcode_count))
    {
        return BCMOS_FALSE;
    }

    if ((this->opcode_count > 0) && (this->opcodes == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"opcodes\" of struct \"bcmolt_epon_oam_oam_reg_tek_cont\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->opcodes = (bcmolt_epon_oam_oam_reg_tek_opcode *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->opcode_count * sizeof(bcmolt_epon_oam_oam_reg_tek_opcode));
        }
    }

    for (i0 = 0; i0 < this->opcode_count; i0++)
    {
        if (!bcmolt_epon_oam_oam_reg_tek_opcode_unpack(&this->opcodes[i0], buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_tek_cont_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    uint8_t opcode_count;
    uint8_t i0;
    if (!bcmolt_epon_oam_buf_read_u8(packed, &opcode_count))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_oam_reg_tek_opcode) * opcode_count);
    for (i0 = 0; i0 < opcode_count; i0++)
    {
        if (!bcmolt_epon_oam_oam_reg_tek_opcode_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_tek_pack(bcmolt_epon_oam_oam_reg_tek *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t preLenFieldPos;
    uint32_t bytesAfterLenField;
    if (!bcmolt_epon_oam_oam_registration_action_pack(this->action, buf))
    {
        return BCMOS_FALSE;
    }

    preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

    /* skip over length field (we'll fill it in later) */
    if (!bcmolt_epon_oam_buf_skip(buf, 2))
    {
        return BCMOS_FALSE;
    }

    switch (this->action)
    {
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_CONT:
            {
                if (!bcmolt_epon_oam_oam_reg_tek_cont_pack(&this->u.cont.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_tek_cont_pack(&this->u.register_and_continue.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_tek_cont_pack(&this->u.unregister_and_continue.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REG:
            {
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER:
            {
            }
            break;
        default:
            {
            }
            break;
    }

    bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint16_t));
    if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, bytesAfterLenField))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint16_t))))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_oam_reg_tek_get_packed_length(bcmolt_epon_oam_oam_reg_tek *this)
{
    uint32_t count = 3;
    switch (this->action)
    {
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_CONT:
            {
                count += bcmolt_epon_oam_oam_reg_tek_cont_get_packed_length(&this->u.cont.value);
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REGISTER_AND_CONTINUE:
            {
                count += bcmolt_epon_oam_oam_reg_tek_cont_get_packed_length(&this->u.register_and_continue.value);
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER_AND_CONTINUE:
            {
                count += bcmolt_epon_oam_oam_reg_tek_cont_get_packed_length(&this->u.unregister_and_continue.value);
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REG:
            {
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER:
            {
            }
            break;
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_tek_unpack(bcmolt_epon_oam_oam_reg_tek *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint16_t length = 0;
    bcmolt_epon_oam_buf postLenBuf;
    if (!bcmolt_epon_oam_oam_registration_action_unpack(&this->action, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, buf->curr);
    switch (this->action)
    {
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_CONT:
            {
                if (!bcmolt_epon_oam_oam_reg_tek_cont_unpack(&this->u.cont.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_tek_cont_unpack(&this->u.register_and_continue.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_tek_cont_unpack(&this->u.unregister_and_continue.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REG:
            {
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER:
            {
            }
            break;
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(buf, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_tek_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_oam_registration_action action;
    bcmolt_epon_oam_buf postLenBuf;
    uint16_t length;
    if (!bcmolt_epon_oam_oam_registration_action_unpack(&action, packed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(packed, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, packed->curr);
    switch (action)
    {
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_CONT:
            {
                if (!bcmolt_epon_oam_oam_reg_tek_cont_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_tek_cont_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_tek_cont_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REG:
            {
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER:
            {
            }
            break;
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_dpoe_var_desc_pack(bcmolt_epon_oam_oam_reg_dpoe_var_desc *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_dpoe_branch_pack(this->branch, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->branch)
    {
        case BCMOLT_EPON_OAM_DPOE_BRANCH_STANDARD_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_var_leaf_attribute_pack(this->u.standard_attribute.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_STANDARD_ACTION:
            {
                if (!bcmolt_epon_oam_var_leaf_action_pack(this->u.standard_action.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_EXTENDED_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_dpoe_leaf_attribute_pack(this->u.extended_attribute.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_EXTENDED_ACTION:
            {
                if (!bcmolt_epon_oam_dpoe_leaf_action_pack(this->u.extended_action.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_END:
        case BCMOLT_EPON_OAM_DPOE_BRANCH_OBJECT:
        case BCMOLT_EPON_OAM_DPOE_BRANCH_PROGRAMMABLE_COUNTER:
        default:
            {
                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.def.leaf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_dpoe_var_desc_unpack(bcmolt_epon_oam_oam_reg_dpoe_var_desc *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_dpoe_branch_unpack(&this->branch, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->branch)
    {
        case BCMOLT_EPON_OAM_DPOE_BRANCH_STANDARD_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_var_leaf_attribute_unpack(&this->u.standard_attribute.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_STANDARD_ACTION:
            {
                if (!bcmolt_epon_oam_var_leaf_action_unpack(&this->u.standard_action.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_EXTENDED_ATTRIBUTE:
            {
                if (!bcmolt_epon_oam_dpoe_leaf_attribute_unpack(&this->u.extended_attribute.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_EXTENDED_ACTION:
            {
                if (!bcmolt_epon_oam_dpoe_leaf_action_unpack(&this->u.extended_action.leaf, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_BRANCH_END:
        case BCMOLT_EPON_OAM_DPOE_BRANCH_OBJECT:
        case BCMOLT_EPON_OAM_DPOE_BRANCH_PROGRAMMABLE_COUNTER:
        default:
            {
                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.def.leaf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_dpoe_var_desc_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 3);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_dpoe_variable_pack(bcmolt_epon_oam_oam_reg_dpoe_variable *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_oam_reg_dpoe_var_desc_pack(&this->descriptor, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_oam_registration_action_pack(this->action, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->length_reserved))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_dpoe_variable_unpack(bcmolt_epon_oam_oam_reg_dpoe_variable *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_oam_reg_dpoe_var_desc_unpack(&this->descriptor, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_oam_registration_action_unpack(&this->action, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->length_reserved))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_dpoe_variable_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 6);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_dpoe_variable_list_pack(bcmolt_epon_oam_oam_reg_dpoe_variable_list *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t i0;
    if (!bcmolt_epon_oam_buf_write_u8(buf, this->variable_count))
    {
        return BCMOS_FALSE;
    }

    if ((this->variable_count > 0) && (this->variables == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"variables\" of struct \"bcmolt_epon_oam_oam_reg_dpoe_variable_list\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->variable_count; i0++)
    {
        if (!bcmolt_epon_oam_oam_reg_dpoe_variable_pack(&this->variables[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_oam_reg_dpoe_variable_list_get_packed_length(bcmolt_epon_oam_oam_reg_dpoe_variable_list *this)
{
    return 1 + (6 * this->variable_count);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_dpoe_variable_list_unpack(bcmolt_epon_oam_oam_reg_dpoe_variable_list *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint8_t i0;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->variable_count))
    {
        return BCMOS_FALSE;
    }

    if ((this->variable_count > 0) && (this->variables == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"variables\" of struct \"bcmolt_epon_oam_oam_reg_dpoe_variable_list\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->variables = (bcmolt_epon_oam_oam_reg_dpoe_variable *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->variable_count * sizeof(bcmolt_epon_oam_oam_reg_dpoe_variable));
        }
    }

    for (i0 = 0; i0 < this->variable_count; i0++)
    {
        if (!bcmolt_epon_oam_oam_reg_dpoe_variable_unpack(&this->variables[i0], buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_dpoe_variable_list_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    uint8_t variable_count;
    if (!bcmolt_epon_oam_buf_read_u8(packed, &variable_count))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_oam_reg_dpoe_variable) * variable_count);
    if (!bcmolt_epon_oam_buf_skip(packed, variable_count * 6))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_dpoe_op_variable_pack(bcmolt_epon_oam_oam_reg_dpoe_op_variable *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t preLenFieldPos;
    uint32_t bytesAfterLenField;
    if (!bcmolt_epon_oam_oam_registration_action_pack(this->action, buf))
    {
        return BCMOS_FALSE;
    }

    preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

    /* skip over length field (we'll fill it in later) */
    if (!bcmolt_epon_oam_buf_skip(buf, 2))
    {
        return BCMOS_FALSE;
    }

    switch (this->action)
    {
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_CONT:
            {
                if (!bcmolt_epon_oam_oam_reg_dpoe_variable_list_pack(&this->u.cont.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_dpoe_variable_list_pack(&this->u.register_and_continue.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_dpoe_variable_list_pack(&this->u.unregister_and_continue.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REG:
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER:
        default:
            {
            }
            break;
    }

    bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint16_t));
    if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, bytesAfterLenField))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint16_t))))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_oam_reg_dpoe_op_variable_get_packed_length(bcmolt_epon_oam_oam_reg_dpoe_op_variable *this)
{
    uint32_t count = 3;
    switch (this->action)
    {
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_CONT:
            {
                count += bcmolt_epon_oam_oam_reg_dpoe_variable_list_get_packed_length(&this->u.cont.value);
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REGISTER_AND_CONTINUE:
            {
                count += bcmolt_epon_oam_oam_reg_dpoe_variable_list_get_packed_length(&this->u.register_and_continue.value);
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER_AND_CONTINUE:
            {
                count += bcmolt_epon_oam_oam_reg_dpoe_variable_list_get_packed_length(&this->u.unregister_and_continue.value);
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REG:
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER:
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_dpoe_op_variable_unpack(bcmolt_epon_oam_oam_reg_dpoe_op_variable *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint16_t length = 0;
    bcmolt_epon_oam_buf postLenBuf;
    if (!bcmolt_epon_oam_oam_registration_action_unpack(&this->action, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, buf->curr);
    switch (this->action)
    {
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_CONT:
            {
                if (!bcmolt_epon_oam_oam_reg_dpoe_variable_list_unpack(&this->u.cont.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_dpoe_variable_list_unpack(&this->u.register_and_continue.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_dpoe_variable_list_unpack(&this->u.unregister_and_continue.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REG:
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(buf, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_dpoe_op_variable_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_oam_registration_action action;
    bcmolt_epon_oam_buf postLenBuf;
    uint16_t length;
    if (!bcmolt_epon_oam_oam_registration_action_unpack(&action, packed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(packed, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, packed->curr);
    switch (action)
    {
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_CONT:
            {
                if (!bcmolt_epon_oam_oam_reg_dpoe_variable_list_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_dpoe_variable_list_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_dpoe_variable_list_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REG:
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_dpoe_opcode_pack(bcmolt_epon_oam_oam_reg_dpoe_opcode *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t preLenFieldPos;
    uint32_t bytesAfterLenField;
    if (!bcmolt_epon_oam_dpoe_opcode_pack(this->opcode, buf))
    {
        return BCMOS_FALSE;
    }

    preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

    /* skip over length field (we'll fill it in later) */
    if (!bcmolt_epon_oam_buf_skip(buf, 2))
    {
        return BCMOS_FALSE;
    }

    switch (this->opcode)
    {
        case BCMOLT_EPON_OAM_DPOE_OPCODE_GET_REQUEST:
            {
                if (!bcmolt_epon_oam_oam_reg_dpoe_op_variable_pack(&this->u.get_request.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_SET_REQUEST:
            {
                if (!bcmolt_epon_oam_oam_reg_dpoe_op_variable_pack(&this->u.set_request.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_DYNAMIC_IPMCAST_CTRL:
        case BCMOLT_EPON_OAM_DPOE_OPCODE_DYNAMIC_IPMCAST_CTRL_RESP:
        case BCMOLT_EPON_OAM_DPOE_OPCODE_FILE_TRANSFER:
        case BCMOLT_EPON_OAM_DPOE_OPCODE_GET_RESPONSE:
        case BCMOLT_EPON_OAM_DPOE_OPCODE_KEY_EXCHANGE:
        case BCMOLT_EPON_OAM_DPOE_OPCODE_MCAST_REG:
        case BCMOLT_EPON_OAM_DPOE_OPCODE_MCAST_REG_RESP:
        case BCMOLT_EPON_OAM_DPOE_OPCODE_RESERVED:
        case BCMOLT_EPON_OAM_DPOE_OPCODE_SET_RESPONSE:
        case BCMOLT_EPON_OAM_DPOE_OPCODE_STATIC_IPMCAST_CTRL:
        case BCMOLT_EPON_OAM_DPOE_OPCODE_STATIC_IPMCAST_CTRL_RESP:
        default:
            {
                if (!bcmolt_epon_oam_oam_registration_action_pack(this->u.def.action, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.def.length_reserved))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint16_t));
    if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, bytesAfterLenField))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint16_t))))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_oam_reg_dpoe_opcode_get_packed_length(bcmolt_epon_oam_oam_reg_dpoe_opcode *this)
{
    uint32_t count = 3;
    switch (this->opcode)
    {
        case BCMOLT_EPON_OAM_DPOE_OPCODE_GET_REQUEST:
            {
                count += bcmolt_epon_oam_oam_reg_dpoe_op_variable_get_packed_length(&this->u.get_request.value);
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_SET_REQUEST:
            {
                count += bcmolt_epon_oam_oam_reg_dpoe_op_variable_get_packed_length(&this->u.set_request.value);
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_DYNAMIC_IPMCAST_CTRL:
        case BCMOLT_EPON_OAM_DPOE_OPCODE_DYNAMIC_IPMCAST_CTRL_RESP:
        case BCMOLT_EPON_OAM_DPOE_OPCODE_FILE_TRANSFER:
        case BCMOLT_EPON_OAM_DPOE_OPCODE_GET_RESPONSE:
        case BCMOLT_EPON_OAM_DPOE_OPCODE_KEY_EXCHANGE:
        case BCMOLT_EPON_OAM_DPOE_OPCODE_MCAST_REG:
        case BCMOLT_EPON_OAM_DPOE_OPCODE_MCAST_REG_RESP:
        case BCMOLT_EPON_OAM_DPOE_OPCODE_RESERVED:
        case BCMOLT_EPON_OAM_DPOE_OPCODE_SET_RESPONSE:
        case BCMOLT_EPON_OAM_DPOE_OPCODE_STATIC_IPMCAST_CTRL:
        case BCMOLT_EPON_OAM_DPOE_OPCODE_STATIC_IPMCAST_CTRL_RESP:
        default:
            {
                count += 3;
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_dpoe_opcode_unpack(bcmolt_epon_oam_oam_reg_dpoe_opcode *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint16_t length = 0;
    bcmolt_epon_oam_buf postLenBuf;
    if (!bcmolt_epon_oam_dpoe_opcode_unpack(&this->opcode, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, buf->curr);
    switch (this->opcode)
    {
        case BCMOLT_EPON_OAM_DPOE_OPCODE_GET_REQUEST:
            {
                if (!bcmolt_epon_oam_oam_reg_dpoe_op_variable_unpack(&this->u.get_request.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_SET_REQUEST:
            {
                if (!bcmolt_epon_oam_oam_reg_dpoe_op_variable_unpack(&this->u.set_request.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_DYNAMIC_IPMCAST_CTRL:
        case BCMOLT_EPON_OAM_DPOE_OPCODE_DYNAMIC_IPMCAST_CTRL_RESP:
        case BCMOLT_EPON_OAM_DPOE_OPCODE_FILE_TRANSFER:
        case BCMOLT_EPON_OAM_DPOE_OPCODE_GET_RESPONSE:
        case BCMOLT_EPON_OAM_DPOE_OPCODE_KEY_EXCHANGE:
        case BCMOLT_EPON_OAM_DPOE_OPCODE_MCAST_REG:
        case BCMOLT_EPON_OAM_DPOE_OPCODE_MCAST_REG_RESP:
        case BCMOLT_EPON_OAM_DPOE_OPCODE_RESERVED:
        case BCMOLT_EPON_OAM_DPOE_OPCODE_SET_RESPONSE:
        case BCMOLT_EPON_OAM_DPOE_OPCODE_STATIC_IPMCAST_CTRL:
        case BCMOLT_EPON_OAM_DPOE_OPCODE_STATIC_IPMCAST_CTRL_RESP:
        default:
            {
                if (!bcmolt_epon_oam_oam_registration_action_unpack(&this->u.def.action, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.def.length_reserved))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(buf, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_dpoe_opcode_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_dpoe_opcode opcode;
    bcmolt_epon_oam_buf postLenBuf;
    uint16_t length;
    if (!bcmolt_epon_oam_dpoe_opcode_unpack(&opcode, packed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(packed, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, packed->curr);
    switch (opcode)
    {
        case BCMOLT_EPON_OAM_DPOE_OPCODE_GET_REQUEST:
            {
                if (!bcmolt_epon_oam_oam_reg_dpoe_op_variable_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_SET_REQUEST:
            {
                if (!bcmolt_epon_oam_oam_reg_dpoe_op_variable_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_DPOE_OPCODE_DYNAMIC_IPMCAST_CTRL:
        case BCMOLT_EPON_OAM_DPOE_OPCODE_DYNAMIC_IPMCAST_CTRL_RESP:
        case BCMOLT_EPON_OAM_DPOE_OPCODE_FILE_TRANSFER:
        case BCMOLT_EPON_OAM_DPOE_OPCODE_GET_RESPONSE:
        case BCMOLT_EPON_OAM_DPOE_OPCODE_KEY_EXCHANGE:
        case BCMOLT_EPON_OAM_DPOE_OPCODE_MCAST_REG:
        case BCMOLT_EPON_OAM_DPOE_OPCODE_MCAST_REG_RESP:
        case BCMOLT_EPON_OAM_DPOE_OPCODE_RESERVED:
        case BCMOLT_EPON_OAM_DPOE_OPCODE_SET_RESPONSE:
        case BCMOLT_EPON_OAM_DPOE_OPCODE_STATIC_IPMCAST_CTRL:
        case BCMOLT_EPON_OAM_DPOE_OPCODE_STATIC_IPMCAST_CTRL_RESP:
        default:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_dpoe_cont_pack(bcmolt_epon_oam_oam_reg_dpoe_cont *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t i0;
    if (!bcmolt_epon_oam_buf_write_u8(buf, this->opcode_count))
    {
        return BCMOS_FALSE;
    }

    if ((this->opcode_count > 0) && (this->opcodes == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"opcodes\" of struct \"bcmolt_epon_oam_oam_reg_dpoe_cont\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->opcode_count; i0++)
    {
        if (!bcmolt_epon_oam_oam_reg_dpoe_opcode_pack(&this->opcodes[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_oam_reg_dpoe_cont_get_packed_length(bcmolt_epon_oam_oam_reg_dpoe_cont *this)
{
    uint32_t count = 1;
    uint32_t i0;
    if ((this->opcode_count > 0) && (this->opcodes == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"opcode_count\" of struct \"bcmolt_epon_oam_oam_reg_dpoe_cont\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return 0;
    }

    for (i0 = 0; i0 < this->opcode_count; i0++)
    {
        count += bcmolt_epon_oam_oam_reg_dpoe_opcode_get_packed_length(&this->opcodes[i0]);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_dpoe_cont_unpack(bcmolt_epon_oam_oam_reg_dpoe_cont *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint8_t i0;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->opcode_count))
    {
        return BCMOS_FALSE;
    }

    if ((this->opcode_count > 0) && (this->opcodes == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"opcodes\" of struct \"bcmolt_epon_oam_oam_reg_dpoe_cont\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->opcodes = (bcmolt_epon_oam_oam_reg_dpoe_opcode *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->opcode_count * sizeof(bcmolt_epon_oam_oam_reg_dpoe_opcode));
        }
    }

    for (i0 = 0; i0 < this->opcode_count; i0++)
    {
        if (!bcmolt_epon_oam_oam_reg_dpoe_opcode_unpack(&this->opcodes[i0], buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_dpoe_cont_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    uint8_t opcode_count;
    uint8_t i0;
    if (!bcmolt_epon_oam_buf_read_u8(packed, &opcode_count))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_oam_reg_dpoe_opcode) * opcode_count);
    for (i0 = 0; i0 < opcode_count; i0++)
    {
        if (!bcmolt_epon_oam_oam_reg_dpoe_opcode_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_dpoe_pack(bcmolt_epon_oam_oam_reg_dpoe *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t preLenFieldPos;
    uint32_t bytesAfterLenField;
    if (!bcmolt_epon_oam_oam_registration_action_pack(this->action, buf))
    {
        return BCMOS_FALSE;
    }

    preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

    /* skip over length field (we'll fill it in later) */
    if (!bcmolt_epon_oam_buf_skip(buf, 2))
    {
        return BCMOS_FALSE;
    }

    switch (this->action)
    {
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_CONT:
            {
                if (!bcmolt_epon_oam_oam_reg_dpoe_cont_pack(&this->u.cont.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_dpoe_cont_pack(&this->u.register_and_continue.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_dpoe_cont_pack(&this->u.unregister_and_continue.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REG:
            {
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER:
            {
            }
            break;
        default:
            {
            }
            break;
    }

    bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint16_t));
    if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, bytesAfterLenField))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint16_t))))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_oam_reg_dpoe_get_packed_length(bcmolt_epon_oam_oam_reg_dpoe *this)
{
    uint32_t count = 3;
    switch (this->action)
    {
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_CONT:
            {
                count += bcmolt_epon_oam_oam_reg_dpoe_cont_get_packed_length(&this->u.cont.value);
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REGISTER_AND_CONTINUE:
            {
                count += bcmolt_epon_oam_oam_reg_dpoe_cont_get_packed_length(&this->u.register_and_continue.value);
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER_AND_CONTINUE:
            {
                count += bcmolt_epon_oam_oam_reg_dpoe_cont_get_packed_length(&this->u.unregister_and_continue.value);
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REG:
            {
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER:
            {
            }
            break;
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_dpoe_unpack(bcmolt_epon_oam_oam_reg_dpoe *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint16_t length = 0;
    bcmolt_epon_oam_buf postLenBuf;
    if (!bcmolt_epon_oam_oam_registration_action_unpack(&this->action, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, buf->curr);
    switch (this->action)
    {
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_CONT:
            {
                if (!bcmolt_epon_oam_oam_reg_dpoe_cont_unpack(&this->u.cont.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_dpoe_cont_unpack(&this->u.register_and_continue.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_dpoe_cont_unpack(&this->u.unregister_and_continue.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REG:
            {
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER:
            {
            }
            break;
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(buf, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_dpoe_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_oam_registration_action action;
    bcmolt_epon_oam_buf postLenBuf;
    uint16_t length;
    if (!bcmolt_epon_oam_oam_registration_action_unpack(&action, packed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(packed, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, packed->curr);
    switch (action)
    {
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_CONT:
            {
                if (!bcmolt_epon_oam_oam_reg_dpoe_cont_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_dpoe_cont_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_dpoe_cont_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REG:
            {
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER:
            {
            }
            break;
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_vendor_oui_pack(bcmolt_epon_oam_oam_reg_vendor_oui *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_well_known_oui_pack(this->oui, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->oui)
    {
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_CTC:
            {
                if (!bcmolt_epon_oam_oam_reg_ctc_pack(&this->u.ctc.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_TEK:
            {
                if (!bcmolt_epon_oam_oam_reg_tek_pack(&this->u.tek.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DPOE:
            {
                if (!bcmolt_epon_oam_oam_reg_dpoe_pack(&this->u.dpoe.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_BRCM:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DASAN:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_KT:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_PMC:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_SIEPON_A:
        default:
            {
                if (!bcmolt_epon_oam_oam_registration_action_pack(this->u.def.action, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.def.length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_oam_reg_vendor_oui_get_packed_length(bcmolt_epon_oam_oam_reg_vendor_oui *this)
{
    uint32_t count = 3;
    switch (this->oui)
    {
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_CTC:
            {
                count += bcmolt_epon_oam_oam_reg_ctc_get_packed_length(&this->u.ctc.value);
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_TEK:
            {
                count += bcmolt_epon_oam_oam_reg_tek_get_packed_length(&this->u.tek.value);
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DPOE:
            {
                count += bcmolt_epon_oam_oam_reg_dpoe_get_packed_length(&this->u.dpoe.value);
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_BRCM:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DASAN:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_KT:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_PMC:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_SIEPON_A:
        default:
            {
                count += 3;
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_vendor_oui_unpack(bcmolt_epon_oam_oam_reg_vendor_oui *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_well_known_oui_unpack(&this->oui, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->oui)
    {
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_CTC:
            {
                if (!bcmolt_epon_oam_oam_reg_ctc_unpack(&this->u.ctc.value, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_TEK:
            {
                if (!bcmolt_epon_oam_oam_reg_tek_unpack(&this->u.tek.value, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DPOE:
            {
                if (!bcmolt_epon_oam_oam_reg_dpoe_unpack(&this->u.dpoe.value, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_BRCM:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DASAN:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_KT:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_PMC:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_SIEPON_A:
        default:
            {
                if (!bcmolt_epon_oam_oam_registration_action_unpack(&this->u.def.action, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(buf, &this->u.def.length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_vendor_oui_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_well_known_oui oui;
    if (!bcmolt_epon_oam_well_known_oui_unpack(&oui, packed))
    {
        return BCMOS_FALSE;
    }

    switch (oui)
    {
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_CTC:
            {
                if (!bcmolt_epon_oam_oam_reg_ctc_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_TEK:
            {
                if (!bcmolt_epon_oam_oam_reg_tek_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DPOE:
            {
                if (!bcmolt_epon_oam_oam_reg_dpoe_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_BRCM:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DASAN:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_KT:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_PMC:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_SIEPON_A:
        default:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_vendor_cont_pack(bcmolt_epon_oam_oam_reg_vendor_cont *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t i0;
    if (!bcmolt_epon_oam_buf_write_u8(buf, this->vendor_oui_reg_count))
    {
        return BCMOS_FALSE;
    }

    if ((this->vendor_oui_reg_count > 0) && (this->vendor_oui_reg == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vendor_oui_reg\" of struct \"bcmolt_epon_oam_oam_reg_vendor_cont\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->vendor_oui_reg_count; i0++)
    {
        if (!bcmolt_epon_oam_oam_reg_vendor_oui_pack(&this->vendor_oui_reg[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_oam_reg_vendor_cont_get_packed_length(bcmolt_epon_oam_oam_reg_vendor_cont *this)
{
    uint32_t count = 1;
    uint32_t i0;
    if ((this->vendor_oui_reg_count > 0) && (this->vendor_oui_reg == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vendor_oui_reg_count\" of struct \"bcmolt_epon_oam_oam_reg_vendor_cont\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return 0;
    }

    for (i0 = 0; i0 < this->vendor_oui_reg_count; i0++)
    {
        count += bcmolt_epon_oam_oam_reg_vendor_oui_get_packed_length(&this->vendor_oui_reg[i0]);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_vendor_cont_unpack(bcmolt_epon_oam_oam_reg_vendor_cont *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint8_t i0;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->vendor_oui_reg_count))
    {
        return BCMOS_FALSE;
    }

    if ((this->vendor_oui_reg_count > 0) && (this->vendor_oui_reg == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"vendor_oui_reg\" of struct \"bcmolt_epon_oam_oam_reg_vendor_cont\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->vendor_oui_reg = (bcmolt_epon_oam_oam_reg_vendor_oui *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->vendor_oui_reg_count * sizeof(bcmolt_epon_oam_oam_reg_vendor_oui));
        }
    }

    for (i0 = 0; i0 < this->vendor_oui_reg_count; i0++)
    {
        if (!bcmolt_epon_oam_oam_reg_vendor_oui_unpack(&this->vendor_oui_reg[i0], buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_vendor_cont_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    uint8_t vendor_oui_reg_count;
    uint8_t i0;
    if (!bcmolt_epon_oam_buf_read_u8(packed, &vendor_oui_reg_count))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_oam_reg_vendor_oui) * vendor_oui_reg_count);
    for (i0 = 0; i0 < vendor_oui_reg_count; i0++)
    {
        if (!bcmolt_epon_oam_oam_reg_vendor_oui_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_vendor_pack(bcmolt_epon_oam_oam_reg_vendor *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t preLenFieldPos;
    uint32_t bytesAfterLenField;
    if (!bcmolt_epon_oam_oam_registration_action_pack(this->action, buf))
    {
        return BCMOS_FALSE;
    }

    preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

    /* skip over length field (we'll fill it in later) */
    if (!bcmolt_epon_oam_buf_skip(buf, 2))
    {
        return BCMOS_FALSE;
    }

    switch (this->action)
    {
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_CONT:
            {
                if (!bcmolt_epon_oam_oam_reg_vendor_cont_pack(&this->u.cont.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_vendor_cont_pack(&this->u.register_and_continue.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_vendor_cont_pack(&this->u.unregister_and_continue.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REG:
            {
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER:
            {
            }
            break;
        default:
            {
            }
            break;
    }

    bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint16_t));
    if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, bytesAfterLenField))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint16_t))))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_oam_reg_vendor_get_packed_length(bcmolt_epon_oam_oam_reg_vendor *this)
{
    uint32_t count = 3;
    switch (this->action)
    {
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_CONT:
            {
                count += bcmolt_epon_oam_oam_reg_vendor_cont_get_packed_length(&this->u.cont.value);
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REGISTER_AND_CONTINUE:
            {
                count += bcmolt_epon_oam_oam_reg_vendor_cont_get_packed_length(&this->u.register_and_continue.value);
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER_AND_CONTINUE:
            {
                count += bcmolt_epon_oam_oam_reg_vendor_cont_get_packed_length(&this->u.unregister_and_continue.value);
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REG:
            {
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER:
            {
            }
            break;
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_vendor_unpack(bcmolt_epon_oam_oam_reg_vendor *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint16_t length = 0;
    bcmolt_epon_oam_buf postLenBuf;
    if (!bcmolt_epon_oam_oam_registration_action_unpack(&this->action, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, buf->curr);
    switch (this->action)
    {
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_CONT:
            {
                if (!bcmolt_epon_oam_oam_reg_vendor_cont_unpack(&this->u.cont.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_vendor_cont_unpack(&this->u.register_and_continue.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_vendor_cont_unpack(&this->u.unregister_and_continue.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REG:
            {
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER:
            {
            }
            break;
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(buf, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_vendor_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_oam_registration_action action;
    bcmolt_epon_oam_buf postLenBuf;
    uint16_t length;
    if (!bcmolt_epon_oam_oam_registration_action_unpack(&action, packed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(packed, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, packed->curr);
    switch (action)
    {
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_CONT:
            {
                if (!bcmolt_epon_oam_oam_reg_vendor_cont_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_vendor_cont_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER_AND_CONTINUE:
            {
                if (!bcmolt_epon_oam_oam_reg_vendor_cont_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REG:
            {
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER:
            {
            }
            break;
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_opcode_pack(bcmolt_epon_oam_oam_reg_opcode *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t preLenFieldPos;
    uint32_t bytesAfterLenField;
    if (!bcmolt_epon_oam_oam_opcode_pack(this->opcode, buf))
    {
        return BCMOS_FALSE;
    }

    preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

    /* skip over length field (we'll fill it in later) */
    if (!bcmolt_epon_oam_buf_skip(buf, 2))
    {
        return BCMOS_FALSE;
    }

    switch (this->opcode)
    {
        case BCMOLT_EPON_OAM_OAM_OPCODE_INFO:
            {
                if (!bcmolt_epon_oam_oam_reg_info_pack(&this->u.info.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_OPCODE_ORGANIZATION_SPECIFIC:
            {
                if (!bcmolt_epon_oam_oam_reg_vendor_pack(&this->u.organization_specific.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_OPCODE_EVENT_NOTIFICATION:
        case BCMOLT_EPON_OAM_OAM_OPCODE_LOOPBACK_CONTROL:
        case BCMOLT_EPON_OAM_OAM_OPCODE_VAR_REQUEST:
        case BCMOLT_EPON_OAM_OAM_OPCODE_VAR_RESPONSE:
        default:
            {
                if (!bcmolt_epon_oam_oam_registration_action_pack(this->u.def.action, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.def.length_reserved))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint16_t));
    if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, bytesAfterLenField))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint16_t))))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_oam_reg_opcode_get_packed_length(bcmolt_epon_oam_oam_reg_opcode *this)
{
    uint32_t count = 3;
    switch (this->opcode)
    {
        case BCMOLT_EPON_OAM_OAM_OPCODE_INFO:
            {
                count += bcmolt_epon_oam_oam_reg_info_get_packed_length(&this->u.info.value);
            }
            break;
        case BCMOLT_EPON_OAM_OAM_OPCODE_ORGANIZATION_SPECIFIC:
            {
                count += bcmolt_epon_oam_oam_reg_vendor_get_packed_length(&this->u.organization_specific.value);
            }
            break;
        case BCMOLT_EPON_OAM_OAM_OPCODE_EVENT_NOTIFICATION:
        case BCMOLT_EPON_OAM_OAM_OPCODE_LOOPBACK_CONTROL:
        case BCMOLT_EPON_OAM_OAM_OPCODE_VAR_REQUEST:
        case BCMOLT_EPON_OAM_OAM_OPCODE_VAR_RESPONSE:
        default:
            {
                count += 3;
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_opcode_unpack(bcmolt_epon_oam_oam_reg_opcode *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint16_t length = 0;
    bcmolt_epon_oam_buf postLenBuf;
    if (!bcmolt_epon_oam_oam_opcode_unpack(&this->opcode, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, buf->curr);
    switch (this->opcode)
    {
        case BCMOLT_EPON_OAM_OAM_OPCODE_INFO:
            {
                if (!bcmolt_epon_oam_oam_reg_info_unpack(&this->u.info.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_OPCODE_ORGANIZATION_SPECIFIC:
            {
                if (!bcmolt_epon_oam_oam_reg_vendor_unpack(&this->u.organization_specific.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_OPCODE_EVENT_NOTIFICATION:
        case BCMOLT_EPON_OAM_OAM_OPCODE_LOOPBACK_CONTROL:
        case BCMOLT_EPON_OAM_OAM_OPCODE_VAR_REQUEST:
        case BCMOLT_EPON_OAM_OAM_OPCODE_VAR_RESPONSE:
        default:
            {
                if (!bcmolt_epon_oam_oam_registration_action_unpack(&this->u.def.action, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.def.length_reserved))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(buf, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_reg_opcode_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_oam_opcode opcode;
    bcmolt_epon_oam_buf postLenBuf;
    uint16_t length;
    if (!bcmolt_epon_oam_oam_opcode_unpack(&opcode, packed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(packed, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, packed->curr);
    switch (opcode)
    {
        case BCMOLT_EPON_OAM_OAM_OPCODE_INFO:
            {
                if (!bcmolt_epon_oam_oam_reg_info_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_OPCODE_ORGANIZATION_SPECIFIC:
            {
                if (!bcmolt_epon_oam_oam_reg_vendor_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_OPCODE_EVENT_NOTIFICATION:
        case BCMOLT_EPON_OAM_OAM_OPCODE_LOOPBACK_CONTROL:
        case BCMOLT_EPON_OAM_OAM_OPCODE_VAR_REQUEST:
        case BCMOLT_EPON_OAM_OAM_OPCODE_VAR_RESPONSE:
        default:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_registration_pack(bcmolt_epon_oam_oam_registration *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t preLenFieldPos;
    uint32_t bytesAfterLenField;
    if (!bcmolt_epon_oam_buf_write_u8(buf, this->master_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_oam_registration_action_pack(this->action, buf))
    {
        return BCMOS_FALSE;
    }

    preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

    /* skip over length field (we'll fill it in later) */
    if (!bcmolt_epon_oam_buf_skip(buf, 2))
    {
        return BCMOS_FALSE;
    }

    switch (this->action)
    {
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_CONT:
            {
                uint8_t i0;
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.cont.registration_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.cont.registration_count > 0) && (this->u.cont.registration == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"registration\" of struct \"bcmolt_epon_oam_oam_registration_cont\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                for (i0 = 0; i0 < this->u.cont.registration_count; i0++)
                {
                    if (!bcmolt_epon_oam_oam_reg_opcode_pack(&this->u.cont.registration[i0], buf))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REG:
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REGISTER_AND_CONTINUE:
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER:
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER_AND_CONTINUE:
        default:
            {
            }
            break;
    }

    bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint16_t));
    if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, bytesAfterLenField))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint16_t))))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_oam_registration_get_packed_length(bcmolt_epon_oam_oam_registration *this)
{
    uint32_t count = 4;
    switch (this->action)
    {
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_CONT:
            {
                uint32_t i0;
                count += 1;
                if ((this->u.cont.registration_count > 0) && (this->u.cont.registration == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"registration_count\" of struct \"bcmolt_epon_oam_oam_registration\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return 0;
                }

                for (i0 = 0; i0 < this->u.cont.registration_count; i0++)
                {
                    count += bcmolt_epon_oam_oam_reg_opcode_get_packed_length(&this->u.cont.registration[i0]);
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REG:
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REGISTER_AND_CONTINUE:
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER:
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER_AND_CONTINUE:
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_registration_unpack(bcmolt_epon_oam_oam_registration *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint16_t length = 0;
    bcmolt_epon_oam_buf postLenBuf;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->master_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_oam_registration_action_unpack(&this->action, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, buf->curr);
    switch (this->action)
    {
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_CONT:
            {
                uint8_t i0;
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &this->u.cont.registration_count))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.cont.registration_count > 0) && (this->u.cont.registration == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"registration\" of struct \"bcmolt_epon_oam_oam_registration_cont\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.cont.registration = (bcmolt_epon_oam_oam_reg_opcode *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.cont.registration_count * sizeof(bcmolt_epon_oam_oam_reg_opcode));
                    }
                }

                for (i0 = 0; i0 < this->u.cont.registration_count; i0++)
                {
                    if (!bcmolt_epon_oam_oam_reg_opcode_unpack(&this->u.cont.registration[i0], &postLenBuf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REG:
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REGISTER_AND_CONTINUE:
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER:
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER_AND_CONTINUE:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(buf, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_registration_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_oam_registration_action action;
    bcmolt_epon_oam_buf postLenBuf;
    uint16_t length;
    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_oam_registration_action_unpack(&action, packed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(packed, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, packed->curr);
    switch (action)
    {
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_CONT:
            {
                uint8_t registration_count;
                uint8_t i0;
                if (!bcmolt_epon_oam_buf_read_u8(&postLenBuf, &registration_count))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_oam_reg_opcode) * registration_count);
                for (i0 = 0; i0 < registration_count; i0++)
                {
                    if (!bcmolt_epon_oam_oam_reg_opcode_scan(&postLenBuf, extra_mem))
                    {
                        return BCMOS_FALSE;
                    }
                }
            }
            break;
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REG:
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_REGISTER_AND_CONTINUE:
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER:
        case BCMOLT_EPON_OAM_OAM_REGISTRATION_ACTION_UNREGISTER_AND_CONTINUE:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_registration_list_pack(bcmolt_epon_oam_oam_registration_list *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t i0;
    if (!bcmolt_epon_oam_buf_write_u8(buf, this->registrations_count))
    {
        return BCMOS_FALSE;
    }

    if ((this->registrations_count > 0) && (this->registrations == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"registrations\" of struct \"bcmolt_epon_oam_oam_registration_list\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->registrations_count; i0++)
    {
        if (!bcmolt_epon_oam_oam_registration_pack(&this->registrations[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_oam_registration_list_get_packed_length(bcmolt_epon_oam_oam_registration_list *this)
{
    uint32_t count = 1;
    uint32_t i0;
    if ((this->registrations_count > 0) && (this->registrations == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"registrations_count\" of struct \"bcmolt_epon_oam_oam_registration_list\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return 0;
    }

    for (i0 = 0; i0 < this->registrations_count; i0++)
    {
        count += bcmolt_epon_oam_oam_registration_get_packed_length(&this->registrations[i0]);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_registration_list_unpack(bcmolt_epon_oam_oam_registration_list *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint8_t i0;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->registrations_count))
    {
        return BCMOS_FALSE;
    }

    if ((this->registrations_count > 0) && (this->registrations == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"registrations\" of struct \"bcmolt_epon_oam_oam_registration_list\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->registrations = (bcmolt_epon_oam_oam_registration *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->registrations_count * sizeof(bcmolt_epon_oam_oam_registration));
        }
    }

    for (i0 = 0; i0 < this->registrations_count; i0++)
    {
        if (!bcmolt_epon_oam_oam_registration_unpack(&this->registrations[i0], buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_registration_list_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    uint8_t registrations_count;
    uint8_t i0;
    if (!bcmolt_epon_oam_buf_read_u8(packed, &registrations_count))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_oam_registration) * registrations_count);
    for (i0 = 0; i0 < registrations_count; i0++)
    {
        if (!bcmolt_epon_oam_oam_registration_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_master_context_tlv_pack(bcmolt_epon_oam_master_context_tlv *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_master_context_type_pack(this->type, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->type)
    {
        case BCMOLT_EPON_OAM_MASTER_CONTEXT_TYPE_ONU:
            {
            }
            break;
        case BCMOLT_EPON_OAM_MASTER_CONTEXT_TYPE_NETWORK_PON:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.network_pon.port_index))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_MASTER_CONTEXT_TYPE_LINK:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.link.link_index))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_MASTER_CONTEXT_TYPE_USER_PORT:
            {
                if (!bcmolt_epon_oam_buf_write_u8(buf, this->u.user_port.port_index))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_master_context_tlv_get_packed_length(bcmolt_epon_oam_master_context_tlv *this)
{
    uint32_t count = 1;
    switch (this->type)
    {
        case BCMOLT_EPON_OAM_MASTER_CONTEXT_TYPE_ONU:
            {
            }
            break;
        case BCMOLT_EPON_OAM_MASTER_CONTEXT_TYPE_NETWORK_PON:
            {
                count += 1;
            }
            break;
        case BCMOLT_EPON_OAM_MASTER_CONTEXT_TYPE_LINK:
            {
                count += 1;
            }
            break;
        case BCMOLT_EPON_OAM_MASTER_CONTEXT_TYPE_USER_PORT:
            {
                count += 1;
            }
            break;
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_master_context_tlv_unpack(bcmolt_epon_oam_master_context_tlv *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_master_context_type_unpack(&this->type, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->type)
    {
        case BCMOLT_EPON_OAM_MASTER_CONTEXT_TYPE_ONU:
            {
            }
            break;
        case BCMOLT_EPON_OAM_MASTER_CONTEXT_TYPE_NETWORK_PON:
            {
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.network_pon.port_index))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_MASTER_CONTEXT_TYPE_LINK:
            {
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.link.link_index))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_MASTER_CONTEXT_TYPE_USER_PORT:
            {
                if (!bcmolt_epon_oam_buf_read_u8(buf, &this->u.user_port.port_index))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_master_context_tlv_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_master_context_type type;
    if (!bcmolt_epon_oam_master_context_type_unpack(&type, packed))
    {
        return BCMOS_FALSE;
    }

    switch (type)
    {
        case BCMOLT_EPON_OAM_MASTER_CONTEXT_TYPE_ONU:
            {
            }
            break;
        case BCMOLT_EPON_OAM_MASTER_CONTEXT_TYPE_NETWORK_PON:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_MASTER_CONTEXT_TYPE_LINK:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_MASTER_CONTEXT_TYPE_USER_PORT:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_negotiated_oam_pack(bcmolt_epon_oam_negotiated_oam *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t preLenFieldPos;
    uint32_t bytesAfterLenField;
    if (!bcmolt_epon_oam_well_known_oui_pack(this->oui, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_bool(buf, this->negotiated))
    {
        return BCMOS_FALSE;
    }

    preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

    /* skip over length field (we'll fill it in later) */
    if (!bcmolt_epon_oam_buf_skip(buf, 1))
    {
        return BCMOS_FALSE;
    }

    switch (this->oui)
    {
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_TEK:
            {
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_CTC:
            {
                if (!bcmolt_epon_oam_ctc_version_pack(this->u.ctc.version, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DPOE:
            {
                if (!bcmolt_epon_oam_dpoe_version_pack(this->u.dpoe.version, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_BRCM:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DASAN:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_KT:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_PMC:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_SIEPON_A:
        default:
            {
            }
            break;
    }

    bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint8_t));
    if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u8(buf, bytesAfterLenField))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint8_t))))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_negotiated_oam_get_packed_length(bcmolt_epon_oam_negotiated_oam *this)
{
    uint32_t count = 5;
    switch (this->oui)
    {
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_TEK:
            {
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_CTC:
            {
                count += 1;
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DPOE:
            {
                count += 1;
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_BRCM:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DASAN:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_KT:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_PMC:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_SIEPON_A:
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_negotiated_oam_unpack(bcmolt_epon_oam_negotiated_oam *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint8_t version_length = 0;
    bcmolt_epon_oam_buf postLenBuf;
    if (!bcmolt_epon_oam_well_known_oui_unpack(&this->oui, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_bool(buf, &this->negotiated))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(buf, &version_length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, version_length, buf->curr);
    switch (this->oui)
    {
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_TEK:
            {
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_CTC:
            {
                if (!bcmolt_epon_oam_ctc_version_unpack(&this->u.ctc.version, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DPOE:
            {
                if (!bcmolt_epon_oam_dpoe_version_unpack(&this->u.dpoe.version, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_BRCM:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DASAN:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_KT:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_PMC:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_SIEPON_A:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(buf, version_length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_negotiated_oam_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_well_known_oui oui;
    bcmolt_epon_oam_buf postLenBuf;
    uint8_t length;
    if (!bcmolt_epon_oam_well_known_oui_unpack(&oui, packed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u8(packed, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, packed->curr);
    switch (oui)
    {
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_TEK:
            {
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_CTC:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DPOE:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_BRCM:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DASAN:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_KT:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_PMC:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_SIEPON_A:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_negotiated_oam_list_pack(bcmolt_epon_oam_negotiated_oam_list *this, bcmolt_epon_oam_buf *buf)
{
    uint8_t i0;
    if (!bcmolt_epon_oam_buf_write_u8(buf, this->count))
    {
        return BCMOS_FALSE;
    }

    if ((this->count > 0) && (this->negotiated_oams == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"negotiated_oams\" of struct \"bcmolt_epon_oam_negotiated_oam_list\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->count; i0++)
    {
        if (!bcmolt_epon_oam_negotiated_oam_pack(&this->negotiated_oams[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_negotiated_oam_list_get_packed_length(bcmolt_epon_oam_negotiated_oam_list *this)
{
    uint32_t count = 1;
    uint32_t i0;
    if ((this->count > 0) && (this->negotiated_oams == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"count\" of struct \"bcmolt_epon_oam_negotiated_oam_list\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return 0;
    }

    for (i0 = 0; i0 < this->count; i0++)
    {
        count += bcmolt_epon_oam_negotiated_oam_get_packed_length(&this->negotiated_oams[i0]);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_negotiated_oam_list_unpack(bcmolt_epon_oam_negotiated_oam_list *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint8_t i0;
    if (!bcmolt_epon_oam_buf_read_u8(buf, &this->count))
    {
        return BCMOS_FALSE;
    }

    if ((this->count > 0) && (this->negotiated_oams == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"negotiated_oams\" of struct \"bcmolt_epon_oam_negotiated_oam_list\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->negotiated_oams = (bcmolt_epon_oam_negotiated_oam *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->count * sizeof(bcmolt_epon_oam_negotiated_oam));
        }
    }

    for (i0 = 0; i0 < this->count; i0++)
    {
        if (!bcmolt_epon_oam_negotiated_oam_unpack(&this->negotiated_oams[i0], buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_negotiated_oam_list_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    uint8_t count;
    uint8_t i0;
    if (!bcmolt_epon_oam_buf_read_u8(packed, &count))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_oam_negotiated_oam) * count);
    for (i0 = 0; i0 < count; i0++)
    {
        if (!bcmolt_epon_oam_negotiated_oam_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_onu_master_command_pack(bcmolt_epon_oam_onu_master_command *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t preLenFieldPos;
    uint32_t bytesAfterLenField;
    if (!bcmolt_epon_oam_onu_master_command_id_pack(this->command, buf))
    {
        return BCMOS_FALSE;
    }

    preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

    /* skip over length field (we'll fill it in later) */
    if (!bcmolt_epon_oam_buf_skip(buf, 2))
    {
        return BCMOS_FALSE;
    }

    switch (this->command)
    {
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_ENABLE_ONU:
            {
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_DISABLE_ONU:
            {
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_GET_ONU_STATE:
            {
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_GET_OAM_REGISTRATION:
            {
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_SET_OAM_REGISTRATION:
            {
                if (!bcmolt_epon_oam_oam_registration_list_pack(&this->u.set_oam_registration.oam_registrations, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_GET_NEGOTIATED_OAM:
            {
                if (!bcmolt_epon_oam_master_context_tlv_pack(&this->u.get_negotiated_oam.link_context, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_SET_NEGOTIATED_OAM:
            {
                if (!bcmolt_epon_oam_master_context_tlv_pack(&this->u.set_negotiated_oam.link_context, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_negotiated_oam_list_pack(&this->u.set_negotiated_oam.negotiated_oam, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_TERMINATOR:
        default:
            {
            }
            break;
    }

    bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint16_t));
    if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, bytesAfterLenField))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint16_t))))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_onu_master_command_get_packed_length(bcmolt_epon_oam_onu_master_command *this)
{
    uint32_t count = 4;
    switch (this->command)
    {
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_ENABLE_ONU:
            {
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_DISABLE_ONU:
            {
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_GET_ONU_STATE:
            {
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_GET_OAM_REGISTRATION:
            {
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_SET_OAM_REGISTRATION:
            {
                count += bcmolt_epon_oam_oam_registration_list_get_packed_length(&this->u.set_oam_registration.oam_registrations);
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_GET_NEGOTIATED_OAM:
            {
                count += bcmolt_epon_oam_master_context_tlv_get_packed_length(&this->u.get_negotiated_oam.link_context);
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_SET_NEGOTIATED_OAM:
            {
                count += bcmolt_epon_oam_master_context_tlv_get_packed_length(&this->u.set_negotiated_oam.link_context) + bcmolt_epon_oam_negotiated_oam_list_get_packed_length(&this->u.set_negotiated_oam.negotiated_oam);
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_TERMINATOR:
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_onu_master_command_unpack(bcmolt_epon_oam_onu_master_command *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint16_t length = 0;
    bcmolt_epon_oam_buf postLenBuf;
    if (!bcmolt_epon_oam_onu_master_command_id_unpack(&this->command, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, buf->curr);
    switch (this->command)
    {
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_ENABLE_ONU:
            {
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_DISABLE_ONU:
            {
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_GET_ONU_STATE:
            {
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_GET_OAM_REGISTRATION:
            {
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_SET_OAM_REGISTRATION:
            {
                if (!bcmolt_epon_oam_oam_registration_list_unpack(&this->u.set_oam_registration.oam_registrations, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_GET_NEGOTIATED_OAM:
            {
                if (!bcmolt_epon_oam_master_context_tlv_unpack(&this->u.get_negotiated_oam.link_context, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_SET_NEGOTIATED_OAM:
            {
                if (!bcmolt_epon_oam_master_context_tlv_unpack(&this->u.set_negotiated_oam.link_context, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_negotiated_oam_list_unpack(&this->u.set_negotiated_oam.negotiated_oam, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_TERMINATOR:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(buf, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_onu_master_command_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_onu_master_command_id command;
    bcmolt_epon_oam_buf postLenBuf;
    uint16_t length;
    if (!bcmolt_epon_oam_onu_master_command_id_unpack(&command, packed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(packed, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, packed->curr);
    switch (command)
    {
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_ENABLE_ONU:
            {
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_DISABLE_ONU:
            {
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_GET_ONU_STATE:
            {
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_GET_OAM_REGISTRATION:
            {
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_SET_OAM_REGISTRATION:
            {
                if (!bcmolt_epon_oam_oam_registration_list_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_GET_NEGOTIATED_OAM:
            {
                if (!bcmolt_epon_oam_master_context_tlv_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_SET_NEGOTIATED_OAM:
            {
                if (!bcmolt_epon_oam_master_context_tlv_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_negotiated_oam_list_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_TERMINATOR:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_onu_master_response_pack(bcmolt_epon_oam_onu_master_response *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t preLenFieldPos;
    uint32_t bytesAfterLenField;
    if (!bcmolt_epon_oam_onu_master_command_id_pack(this->command, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_onu_master_response_code_pack(this->response_code, buf))
    {
        return BCMOS_FALSE;
    }

    preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

    /* skip over length field (we'll fill it in later) */
    if (!bcmolt_epon_oam_buf_skip(buf, 2))
    {
        return BCMOS_FALSE;
    }

    switch (this->command)
    {
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_ENABLE_ONU:
            {
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_DISABLE_ONU:
            {
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_GET_ONU_STATE:
            {
                if (!bcmolt_epon_oam_onu_state_pack(this->u.get_onu_state.state, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_GET_OAM_REGISTRATION:
            {
                if (!bcmolt_epon_oam_oam_registration_list_pack(&this->u.get_oam_registration.oam_registrations, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_SET_OAM_REGISTRATION:
            {
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_GET_NEGOTIATED_OAM:
            {
                if (!bcmolt_epon_oam_master_context_tlv_pack(&this->u.get_negotiated_oam.link_context, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_negotiated_oam_list_pack(&this->u.get_negotiated_oam.negotiated_oam, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_SET_NEGOTIATED_OAM:
            {
                if (!bcmolt_epon_oam_master_context_tlv_pack(&this->u.set_negotiated_oam.link_context, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_TERMINATOR:
        default:
            {
            }
            break;
    }

    bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint16_t));
    if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, bytesAfterLenField))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint16_t))))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_onu_master_response_get_packed_length(bcmolt_epon_oam_onu_master_response *this)
{
    uint32_t count = 5;
    switch (this->command)
    {
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_ENABLE_ONU:
            {
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_DISABLE_ONU:
            {
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_GET_ONU_STATE:
            {
                count += 1;
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_GET_OAM_REGISTRATION:
            {
                count += bcmolt_epon_oam_oam_registration_list_get_packed_length(&this->u.get_oam_registration.oam_registrations);
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_SET_OAM_REGISTRATION:
            {
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_GET_NEGOTIATED_OAM:
            {
                count += bcmolt_epon_oam_master_context_tlv_get_packed_length(&this->u.get_negotiated_oam.link_context) + bcmolt_epon_oam_negotiated_oam_list_get_packed_length(&this->u.get_negotiated_oam.negotiated_oam);
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_SET_NEGOTIATED_OAM:
            {
                count += bcmolt_epon_oam_master_context_tlv_get_packed_length(&this->u.set_negotiated_oam.link_context);
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_TERMINATOR:
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_onu_master_response_unpack(bcmolt_epon_oam_onu_master_response *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint16_t length = 0;
    bcmolt_epon_oam_buf postLenBuf;
    if (!bcmolt_epon_oam_onu_master_command_id_unpack(&this->command, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_onu_master_response_code_unpack(&this->response_code, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, buf->curr);
    switch (this->command)
    {
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_ENABLE_ONU:
            {
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_DISABLE_ONU:
            {
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_GET_ONU_STATE:
            {
                if (!bcmolt_epon_oam_onu_state_unpack(&this->u.get_onu_state.state, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_GET_OAM_REGISTRATION:
            {
                if (!bcmolt_epon_oam_oam_registration_list_unpack(&this->u.get_oam_registration.oam_registrations, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_SET_OAM_REGISTRATION:
            {
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_GET_NEGOTIATED_OAM:
            {
                if (!bcmolt_epon_oam_master_context_tlv_unpack(&this->u.get_negotiated_oam.link_context, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_negotiated_oam_list_unpack(&this->u.get_negotiated_oam.negotiated_oam, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_SET_NEGOTIATED_OAM:
            {
                if (!bcmolt_epon_oam_master_context_tlv_unpack(&this->u.set_negotiated_oam.link_context, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_TERMINATOR:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(buf, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_onu_master_response_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_onu_master_command_id command;
    bcmolt_epon_oam_buf postLenBuf;
    uint16_t length;
    if (!bcmolt_epon_oam_onu_master_command_id_unpack(&command, packed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(packed, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, packed->curr);
    switch (command)
    {
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_ENABLE_ONU:
            {
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_DISABLE_ONU:
            {
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_GET_ONU_STATE:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_GET_OAM_REGISTRATION:
            {
                if (!bcmolt_epon_oam_oam_registration_list_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_SET_OAM_REGISTRATION:
            {
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_GET_NEGOTIATED_OAM:
            {
                if (!bcmolt_epon_oam_master_context_tlv_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_negotiated_oam_list_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_SET_NEGOTIATED_OAM:
            {
                if (!bcmolt_epon_oam_master_context_tlv_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMAND_ID_TERMINATOR:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_onu_master_communication_pack(bcmolt_epon_oam_onu_master_communication *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_onu_master_communication_type_pack(this->type, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->type)
    {
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMUNICATION_TYPE_COMMAND:
            {
                if (!bcmolt_epon_oam_onu_master_command_pack(&this->u.command.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMUNICATION_TYPE_RESPONSE:
            {
                if (!bcmolt_epon_oam_onu_master_response_pack(&this->u.response.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_onu_master_communication_get_packed_length(bcmolt_epon_oam_onu_master_communication *this)
{
    uint32_t count = 1;
    switch (this->type)
    {
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMUNICATION_TYPE_COMMAND:
            {
                count += bcmolt_epon_oam_onu_master_command_get_packed_length(&this->u.command.value);
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMUNICATION_TYPE_RESPONSE:
            {
                count += bcmolt_epon_oam_onu_master_response_get_packed_length(&this->u.response.value);
            }
            break;
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_onu_master_communication_unpack(bcmolt_epon_oam_onu_master_communication *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_onu_master_communication_type_unpack(&this->type, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->type)
    {
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMUNICATION_TYPE_COMMAND:
            {
                if (!bcmolt_epon_oam_onu_master_command_unpack(&this->u.command.value, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMUNICATION_TYPE_RESPONSE:
            {
                if (!bcmolt_epon_oam_onu_master_response_unpack(&this->u.response.value, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_onu_master_communication_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_onu_master_communication_type type;
    if (!bcmolt_epon_oam_onu_master_communication_type_unpack(&type, packed))
    {
        return BCMOS_FALSE;
    }

    switch (type)
    {
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMUNICATION_TYPE_COMMAND:
            {
                if (!bcmolt_epon_oam_onu_master_command_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_COMMUNICATION_TYPE_RESPONSE:
            {
                if (!bcmolt_epon_oam_onu_master_response_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_master_pdu_common_pack(bcmolt_epon_oam_master_pdu_common *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t preLenFieldPos;
    uint32_t bytesAfterLenField;
    if (!bcmolt_epon_oam_onu_master_protocol_pack(this->protocol, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->correlation_tag))
    {
        return BCMOS_FALSE;
    }

    preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

    /* skip over length field (we'll fill it in later) */
    if (!bcmolt_epon_oam_buf_skip(buf, 2))
    {
        return BCMOS_FALSE;
    }

    switch (this->protocol)
    {
        case BCMOLT_EPON_OAM_ONU_MASTER_PROTOCOL_PING:
            {
                if (!bcmolt_epon_oam_onu_master_ping_flags_pack(this->u.ping.flags, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_PROTOCOL_ENCAPSULATED_FRAME:
            {
                if (!bcmolt_epon_oam_master_end_point_pack(&this->u.encapsulated_frame.dmep, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_master_end_point_pack(&this->u.encapsulated_frame.smep, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write_u16(buf, this->u.encapsulated_frame.frame_length))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.encapsulated_frame.frame_length > 0) && (this->u.encapsulated_frame.frame_data == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"frame_data\" of struct \"bcmolt_epon_oam_master_pdu_common_encapsulated_frame\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.encapsulated_frame.frame_data, this->u.encapsulated_frame.frame_length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_PROTOCOL_OAM_CONTENT:
            {
                if (!bcmolt_epon_oam_onu_master_oam_content_pack(&this->u.oam_content.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_PROTOCOL_REGISTERED_OAM:
            {
                if (!bcmolt_epon_oam_onu_master_oam_content_pack(&this->u.registered_oam.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_PROTOCOL_MASTER_COMMUNICATION:
            {
                if (!bcmolt_epon_oam_onu_master_communication_pack(&this->u.master_communication.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_PROTOCOL_BROADCOM_SDK:
        case BCMOLT_EPON_OAM_ONU_MASTER_PROTOCOL_MASTER_PROTOCOL_TEK_UNKNOWN:
        default:
            {
            }
            break;
    }

    bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint16_t));
    if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, bytesAfterLenField))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint16_t))))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_master_pdu_common_get_packed_length(bcmolt_epon_oam_master_pdu_common *this)
{
    uint32_t count = 6;
    switch (this->protocol)
    {
        case BCMOLT_EPON_OAM_ONU_MASTER_PROTOCOL_PING:
            {
                count += 2;
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_PROTOCOL_ENCAPSULATED_FRAME:
            {
                count += 6 + this->u.encapsulated_frame.frame_length;
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_PROTOCOL_OAM_CONTENT:
            {
                count += bcmolt_epon_oam_onu_master_oam_content_get_packed_length(&this->u.oam_content.value);
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_PROTOCOL_REGISTERED_OAM:
            {
                count += bcmolt_epon_oam_onu_master_oam_content_get_packed_length(&this->u.registered_oam.value);
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_PROTOCOL_MASTER_COMMUNICATION:
            {
                count += bcmolt_epon_oam_onu_master_communication_get_packed_length(&this->u.master_communication.value);
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_PROTOCOL_BROADCOM_SDK:
        case BCMOLT_EPON_OAM_ONU_MASTER_PROTOCOL_MASTER_PROTOCOL_TEK_UNKNOWN:
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_master_pdu_common_unpack(bcmolt_epon_oam_master_pdu_common *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint16_t length = 0;
    bcmolt_epon_oam_buf postLenBuf;
    if (!bcmolt_epon_oam_onu_master_protocol_unpack(&this->protocol, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->correlation_tag))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, buf->curr);
    switch (this->protocol)
    {
        case BCMOLT_EPON_OAM_ONU_MASTER_PROTOCOL_PING:
            {
                if (!bcmolt_epon_oam_onu_master_ping_flags_unpack(&this->u.ping.flags, &postLenBuf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_PROTOCOL_ENCAPSULATED_FRAME:
            {
                if (!bcmolt_epon_oam_master_end_point_unpack(&this->u.encapsulated_frame.dmep, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_master_end_point_unpack(&this->u.encapsulated_frame.smep, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &this->u.encapsulated_frame.frame_length))
                {
                    return BCMOS_FALSE;
                }

                if ((this->u.encapsulated_frame.frame_length > 0) && (this->u.encapsulated_frame.frame_data == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"frame_data\" of struct \"bcmolt_epon_oam_master_pdu_common_encapsulated_frame\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.encapsulated_frame.frame_data = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.encapsulated_frame.frame_length * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.encapsulated_frame.frame_data, this->u.encapsulated_frame.frame_length))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_PROTOCOL_OAM_CONTENT:
            {
                if (!bcmolt_epon_oam_onu_master_oam_content_unpack(&this->u.oam_content.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_PROTOCOL_REGISTERED_OAM:
            {
                if (!bcmolt_epon_oam_onu_master_oam_content_unpack(&this->u.registered_oam.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_PROTOCOL_MASTER_COMMUNICATION:
            {
                if (!bcmolt_epon_oam_onu_master_communication_unpack(&this->u.master_communication.value, &postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_PROTOCOL_BROADCOM_SDK:
        case BCMOLT_EPON_OAM_ONU_MASTER_PROTOCOL_MASTER_PROTOCOL_TEK_UNKNOWN:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(buf, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_master_pdu_common_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_onu_master_protocol protocol;
    bcmolt_epon_oam_buf postLenBuf;
    uint16_t length;
    if (!bcmolt_epon_oam_onu_master_protocol_unpack(&protocol, packed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 2))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(packed, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, packed->curr);
    switch (protocol)
    {
        case BCMOLT_EPON_OAM_ONU_MASTER_PROTOCOL_PING:
            {
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_PROTOCOL_ENCAPSULATED_FRAME:
            {
                uint16_t frame_length;
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_read_u16(&postLenBuf, &frame_length))
                {
                    return BCMOS_FALSE;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint8_t) * frame_length);
                if (!bcmolt_epon_oam_buf_skip(&postLenBuf, frame_length * 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_PROTOCOL_OAM_CONTENT:
            {
                if (!bcmolt_epon_oam_onu_master_oam_content_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_PROTOCOL_REGISTERED_OAM:
            {
                if (!bcmolt_epon_oam_onu_master_oam_content_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_PROTOCOL_MASTER_COMMUNICATION:
            {
                if (!bcmolt_epon_oam_onu_master_communication_scan(&postLenBuf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_ONU_MASTER_PROTOCOL_BROADCOM_SDK:
        case BCMOLT_EPON_OAM_ONU_MASTER_PROTOCOL_MASTER_PROTOCOL_TEK_UNKNOWN:
        default:
            {
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_organization_specific_slow_protocol_pack(bcmolt_epon_oam_organization_specific_slow_protocol *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_well_known_oui_pack(this->oui, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->oui)
    {
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_TEK:
            {
                if (!bcmolt_epon_oam_master_pdu_common_pack(&this->u.tek.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_BRCM:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_CTC:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DASAN:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DPOE:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_KT:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_PMC:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_SIEPON_A:
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_organization_specific_slow_protocol_get_packed_length(bcmolt_epon_oam_organization_specific_slow_protocol *this)
{
    uint32_t count = 3;
    switch (this->oui)
    {
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_TEK:
            {
                count += bcmolt_epon_oam_master_pdu_common_get_packed_length(&this->u.tek.value);
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_BRCM:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_CTC:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DASAN:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DPOE:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_KT:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_PMC:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_SIEPON_A:
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_organization_specific_slow_protocol_unpack(bcmolt_epon_oam_organization_specific_slow_protocol *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_well_known_oui_unpack(&this->oui, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->oui)
    {
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_TEK:
            {
                if (!bcmolt_epon_oam_master_pdu_common_unpack(&this->u.tek.value, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_BRCM:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_CTC:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DASAN:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DPOE:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_KT:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_PMC:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_SIEPON_A:
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_organization_specific_slow_protocol_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_well_known_oui oui;
    if (!bcmolt_epon_oam_well_known_oui_unpack(&oui, packed))
    {
        return BCMOS_FALSE;
    }

    switch (oui)
    {
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_TEK:
            {
                if (!bcmolt_epon_oam_master_pdu_common_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_BRCM:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_CTC:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DASAN:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_DPOE:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_KT:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_PMC:
        case BCMOLT_EPON_OAM_WELL_KNOWN_OUI_SIEPON_A:
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_slow_protocol_pack(bcmolt_epon_oam_slow_protocol *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_slow_protocol_subtype_pack(this->subtype, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->subtype)
    {
        case BCMOLT_EPON_OAM_SLOW_PROTOCOL_SUBTYPE_OAM:
            {
                if (!bcmolt_epon_oam_oam_flags_pack(this->u.oam.flags, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_oam_pdu_content_pack(&this->u.oam.content, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_SLOW_PROTOCOL_SUBTYPE_ORGANIZATION_SPECIFIC:
            {
                if (!bcmolt_epon_oam_organization_specific_slow_protocol_pack(&this->u.organization_specific.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_SLOW_PROTOCOL_SUBTYPE_LACP:
        case BCMOLT_EPON_OAM_SLOW_PROTOCOL_SUBTYPE_LAMP:
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_slow_protocol_get_packed_length(bcmolt_epon_oam_slow_protocol *this)
{
    uint32_t count = 1;
    switch (this->subtype)
    {
        case BCMOLT_EPON_OAM_SLOW_PROTOCOL_SUBTYPE_OAM:
            {
                count += 2 + bcmolt_epon_oam_oam_pdu_content_get_packed_length(&this->u.oam.content);
            }
            break;
        case BCMOLT_EPON_OAM_SLOW_PROTOCOL_SUBTYPE_ORGANIZATION_SPECIFIC:
            {
                count += bcmolt_epon_oam_organization_specific_slow_protocol_get_packed_length(&this->u.organization_specific.value);
            }
            break;
        case BCMOLT_EPON_OAM_SLOW_PROTOCOL_SUBTYPE_LACP:
        case BCMOLT_EPON_OAM_SLOW_PROTOCOL_SUBTYPE_LAMP:
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_slow_protocol_unpack(bcmolt_epon_oam_slow_protocol *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_slow_protocol_subtype_unpack(&this->subtype, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->subtype)
    {
        case BCMOLT_EPON_OAM_SLOW_PROTOCOL_SUBTYPE_OAM:
            {
                if (!bcmolt_epon_oam_oam_flags_unpack(&this->u.oam.flags, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_oam_pdu_content_unpack(&this->u.oam.content, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_SLOW_PROTOCOL_SUBTYPE_ORGANIZATION_SPECIFIC:
            {
                if (!bcmolt_epon_oam_organization_specific_slow_protocol_unpack(&this->u.organization_specific.value, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_SLOW_PROTOCOL_SUBTYPE_LACP:
        case BCMOLT_EPON_OAM_SLOW_PROTOCOL_SUBTYPE_LAMP:
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_slow_protocol_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_slow_protocol_subtype subtype;
    if (!bcmolt_epon_oam_slow_protocol_subtype_unpack(&subtype, packed))
    {
        return BCMOS_FALSE;
    }

    switch (subtype)
    {
        case BCMOLT_EPON_OAM_SLOW_PROTOCOL_SUBTYPE_OAM:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_oam_pdu_content_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_SLOW_PROTOCOL_SUBTYPE_ORGANIZATION_SPECIFIC:
            {
                if (!bcmolt_epon_oam_organization_specific_slow_protocol_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_SLOW_PROTOCOL_SUBTYPE_LACP:
        case BCMOLT_EPON_OAM_SLOW_PROTOCOL_SUBTYPE_LAMP:
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ethernet_protocol_pack(bcmolt_epon_oam_ethernet_protocol *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_protocol_type_pack(this->ethertype, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->ethertype)
    {
        case BCMOLT_EPON_OAM_PROTOCOL_TYPE_ZERO:
            {
                if ((this->u.zero.padding_count > 0) && (this->u.zero.padding == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"padding\" of struct \"bcmolt_epon_oam_ethernet_protocol_zero\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.zero.padding, this->u.zero.padding_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_PROTOCOL_TYPE_CVLAN:
            {
                if (!bcmolt_epon_oam_vlan_value_pack(&this->u.cvlan.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_PROTOCOL_TYPE_SVLAN:
            {
                if (!bcmolt_epon_oam_vlan_value_pack(&this->u.svlan.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_PROTOCOL_TYPE_ITAG:
            {
                if (!bcmolt_epon_oam_itag_value_pack(&this->u.itag.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_PROTOCOL_TYPE_SLOW_PROTOCOL:
            {
                if (!bcmolt_epon_oam_slow_protocol_pack(&this->u.slow_protocol.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_PROTOCOL_TYPE_EAPOL:
            {
                if (!bcmolt_epon_oam_eapol_protocol_pack(&this->u.eapol.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_PROTOCOL_TYPE_ARP:
        case BCMOLT_EPON_OAM_PROTOCOL_TYPE_IPV4:
        case BCMOLT_EPON_OAM_PROTOCOL_TYPE_IPV6:
        case BCMOLT_EPON_OAM_PROTOCOL_TYPE_LOOPBACK:
        case BCMOLT_EPON_OAM_PROTOCOL_TYPE_MPCP:
        default:
            {
                if ((this->u.def.unknown_count > 0) && (this->u.def.unknown == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"unknown\" of struct \"bcmolt_epon_oam_ethernet_protocol_def\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.def.unknown, this->u.def.unknown_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ethernet_protocol_get_packed_length(bcmolt_epon_oam_ethernet_protocol *this)
{
    uint32_t count = 2;
    switch (this->ethertype)
    {
        case BCMOLT_EPON_OAM_PROTOCOL_TYPE_ZERO:
            {
                count += this->u.zero.padding_count;
            }
            break;
        case BCMOLT_EPON_OAM_PROTOCOL_TYPE_CVLAN:
            {
                count += 2;
            }
            break;
        case BCMOLT_EPON_OAM_PROTOCOL_TYPE_SVLAN:
            {
                count += 2;
            }
            break;
        case BCMOLT_EPON_OAM_PROTOCOL_TYPE_ITAG:
            {
                count += 4;
            }
            break;
        case BCMOLT_EPON_OAM_PROTOCOL_TYPE_SLOW_PROTOCOL:
            {
                count += bcmolt_epon_oam_slow_protocol_get_packed_length(&this->u.slow_protocol.value);
            }
            break;
        case BCMOLT_EPON_OAM_PROTOCOL_TYPE_EAPOL:
            {
                count += bcmolt_epon_oam_eapol_protocol_get_packed_length(&this->u.eapol.value);
            }
            break;
        case BCMOLT_EPON_OAM_PROTOCOL_TYPE_ARP:
        case BCMOLT_EPON_OAM_PROTOCOL_TYPE_IPV4:
        case BCMOLT_EPON_OAM_PROTOCOL_TYPE_IPV6:
        case BCMOLT_EPON_OAM_PROTOCOL_TYPE_LOOPBACK:
        case BCMOLT_EPON_OAM_PROTOCOL_TYPE_MPCP:
        default:
            {
                count += this->u.def.unknown_count;
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ethernet_protocol_unpack(bcmolt_epon_oam_ethernet_protocol *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_protocol_type_unpack(&this->ethertype, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->ethertype)
    {
        case BCMOLT_EPON_OAM_PROTOCOL_TYPE_ZERO:
            {
                this->u.zero.padding_count = bcmolt_epon_oam_ethernet_protocol_zero_count_padding(buf);
                if ((this->u.zero.padding_count > 0) && (this->u.zero.padding == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"padding\" of struct \"bcmolt_epon_oam_ethernet_protocol_zero\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.zero.padding = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.zero.padding_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.zero.padding, this->u.zero.padding_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_PROTOCOL_TYPE_CVLAN:
            {
                if (!bcmolt_epon_oam_vlan_value_unpack(&this->u.cvlan.value, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_PROTOCOL_TYPE_SVLAN:
            {
                if (!bcmolt_epon_oam_vlan_value_unpack(&this->u.svlan.value, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_PROTOCOL_TYPE_ITAG:
            {
                if (!bcmolt_epon_oam_itag_value_unpack(&this->u.itag.value, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_PROTOCOL_TYPE_SLOW_PROTOCOL:
            {
                if (!bcmolt_epon_oam_slow_protocol_unpack(&this->u.slow_protocol.value, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_PROTOCOL_TYPE_EAPOL:
            {
                if (!bcmolt_epon_oam_eapol_protocol_unpack(&this->u.eapol.value, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_PROTOCOL_TYPE_ARP:
        case BCMOLT_EPON_OAM_PROTOCOL_TYPE_IPV4:
        case BCMOLT_EPON_OAM_PROTOCOL_TYPE_IPV6:
        case BCMOLT_EPON_OAM_PROTOCOL_TYPE_LOOPBACK:
        case BCMOLT_EPON_OAM_PROTOCOL_TYPE_MPCP:
        default:
            {
                this->u.def.unknown_count = bcmolt_epon_oam_ethernet_protocol_def_count_unknown(buf);
                if ((this->u.def.unknown_count > 0) && (this->u.def.unknown == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"unknown\" of struct \"bcmolt_epon_oam_ethernet_protocol_def\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.def.unknown = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.def.unknown_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(buf, this->u.def.unknown, this->u.def.unknown_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ethernet_protocol_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_protocol_type ethertype;
    if (!bcmolt_epon_oam_protocol_type_unpack(&ethertype, packed))
    {
        return BCMOS_FALSE;
    }

    switch (ethertype)
    {
        case BCMOLT_EPON_OAM_PROTOCOL_TYPE_ZERO:
            {
                uint32_t padding_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(packed, 1))
                    {
                        break;
                    }

                    padding_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(padding_elem_count * sizeof(uint8_t));
            }
            break;
        case BCMOLT_EPON_OAM_PROTOCOL_TYPE_CVLAN:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_PROTOCOL_TYPE_SVLAN:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_PROTOCOL_TYPE_ITAG:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_PROTOCOL_TYPE_SLOW_PROTOCOL:
            {
                if (!bcmolt_epon_oam_slow_protocol_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_PROTOCOL_TYPE_EAPOL:
            {
                if (!bcmolt_epon_oam_eapol_protocol_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_PROTOCOL_TYPE_ARP:
        case BCMOLT_EPON_OAM_PROTOCOL_TYPE_IPV4:
        case BCMOLT_EPON_OAM_PROTOCOL_TYPE_IPV6:
        case BCMOLT_EPON_OAM_PROTOCOL_TYPE_LOOPBACK:
        case BCMOLT_EPON_OAM_PROTOCOL_TYPE_MPCP:
        default:
            {
                uint32_t unknown_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(packed, 1))
                    {
                        break;
                    }

                    unknown_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(unknown_elem_count * sizeof(uint8_t));
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ethernet_protocol_def_count_unknown(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ethernet_protocol_zero_count_padding(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ethernet_frame_pack(bcmolt_epon_oam_ethernet_frame *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t i0;
    if (!bcmolt_epon_oam_buf_write_mac_address(buf, this->da))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_mac_address(buf, this->sa))
    {
        return BCMOS_FALSE;
    }

    if ((this->protocols_count > 0) && (this->protocols == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"protocols\" of struct \"bcmolt_epon_oam_ethernet_frame\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->protocols_count; i0++)
    {
        if (!bcmolt_epon_oam_ethernet_protocol_pack(&this->protocols[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ethernet_frame_get_packed_length(bcmolt_epon_oam_ethernet_frame *this)
{
    uint32_t count = 12;
    uint32_t i0;
    if ((this->protocols_count > 0) && (this->protocols == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"protocols_count\" of struct \"bcmolt_epon_oam_ethernet_frame\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return 0;
    }

    for (i0 = 0; i0 < this->protocols_count; i0++)
    {
        count += bcmolt_epon_oam_ethernet_protocol_get_packed_length(&this->protocols[i0]);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ethernet_frame_unpack(bcmolt_epon_oam_ethernet_frame *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint32_t i0;
    if (!bcmolt_epon_oam_buf_read_mac_address(buf, &this->da))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_mac_address(buf, &this->sa))
    {
        return BCMOS_FALSE;
    }

    this->protocols_count = bcmolt_epon_oam_ethernet_frame_count_protocols(buf);
    if ((this->protocols_count > 0) && (this->protocols == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"protocols\" of struct \"bcmolt_epon_oam_ethernet_frame\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->protocols = (bcmolt_epon_oam_ethernet_protocol *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->protocols_count * sizeof(bcmolt_epon_oam_ethernet_protocol));
        }
    }

    for (i0 = 0; i0 < this->protocols_count; i0++)
    {
        if (!bcmolt_epon_oam_ethernet_protocol_unpack(&this->protocols[i0], buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_ethernet_frame_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    uint32_t protocols_elem_count = 0;
    if (!bcmolt_epon_oam_buf_skip(packed, 6))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 6))
    {
        return BCMOS_FALSE;
    }

    while (BCMOS_TRUE)
    {
        if (!bcmolt_epon_oam_ethernet_protocol_scan(packed, extra_mem))
        {
            break;
        }

        protocols_elem_count += 1;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(protocols_elem_count * sizeof(bcmolt_epon_oam_ethernet_protocol));
    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_ethernet_frame_count_protocols(bcmolt_epon_oam_buf *buf)
{
    uint32_t count = 0;
    uint32_t dummy = 0;
    bcmolt_epon_oam_buf bufClone = *buf;
    while (BCMOS_TRUE)
    {
        if (!bcmolt_epon_oam_ethernet_protocol_scan(&bufClone, &dummy))
        {
            break;
        }

        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_pdu_base_pack(bcmolt_epon_oam_oam_pdu_base *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_mac_address(buf, this->da))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_mac_address(buf, this->sa))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_protocol_type_pack(this->protocol_type, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_slow_protocol_subtype_pack(this->subtype, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_oam_flags_pack(this->flags, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_oam_pdu_content_pack(&this->content, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_oam_pdu_base_get_packed_length(bcmolt_epon_oam_oam_pdu_base *this)
{
    return 17 + bcmolt_epon_oam_oam_pdu_content_get_packed_length(&this->content);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_pdu_base_unpack(bcmolt_epon_oam_oam_pdu_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_mac_address(buf, &this->da))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_mac_address(buf, &this->sa))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_protocol_type_unpack(&this->protocol_type, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_slow_protocol_subtype_unpack(&this->subtype, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_oam_flags_unpack(&this->flags, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_oam_pdu_content_unpack(&this->content, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_pdu_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    if (!bcmolt_epon_oam_buf_skip(packed, 6))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 6))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 2))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 2))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_oam_pdu_content_scan(packed, extra_mem))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_tek_event_gpio_pack(bcmolt_epon_oam_oam_tek_event_gpio *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_u32(buf, this->reserved))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u32(buf, this->gpio_state1g))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u64(buf, this->gpio_state10g))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_tek_event_gpio_unpack(bcmolt_epon_oam_oam_tek_event_gpio *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->reserved))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u32(buf, &this->gpio_state1g))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u64(buf, &this->gpio_state10g))
    {
        /*Optional unpack fails do not cause errors */
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_tek_event_gpio_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 16);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_tek_event_pack(bcmolt_epon_oam_oam_tek_event *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_tek_alarm_code_pack(this->alarm_code, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_bool(buf, this->raised))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->port))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->link))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, this->queue))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_tek_alarm_context_pack(this->alarm_context, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->alarm_code)
    {
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_STAT_ALARM:
            {
                if (!bcmolt_epon_oam_tek_leaf_attribute_pack(this->u.stat_alarm.stat_id, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_GPIO_LINK_FAULT:
            {
                if (!bcmolt_epon_oam_oam_tek_event_gpio_pack(&this->u.gpio_link_fault.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_GPIO_DYING_GASP:
            {
                if (!bcmolt_epon_oam_oam_tek_event_gpio_pack(&this->u.gpio_dying_gasp.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_GPIO_CRITICAL_EVENT:
            {
                if (!bcmolt_epon_oam_oam_tek_event_gpio_pack(&this->u.gpio_critical_event.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_GPIO_OTHER:
            {
                if (!bcmolt_epon_oam_oam_tek_event_gpio_pack(&this->u.gpio_other.value, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_AUTH_UNAVAIL:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_AUTO_NEG_FAILURE:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_BOOT_INVALID:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_CRITICAL_EVENT:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_CTC_ALARM:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_CTC_DISCOVER:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_DIAG_LOAD:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_DYING_GASP:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_FAN_FAULT:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_FLASH_BUSY:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_FLOW_CONTROL_TIMEOUT:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_GATE_TIMEOUT:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_IPN_LOS:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_KEY_EXCHANGE:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_LASER_ALWAYS_ON:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_LEARN_TABLE_OVERFLOW:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_LINK_FAULT:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_LINK_OAM_DISC_COMPLETE:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_LINK_REG_FAIL:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_LINK_REG_START:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_LINK_REG_SUCCESS:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_LOOPBACK:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_LOSS_OF_SIGNAL:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_OAM_TIMEOUT:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_ONU_PON_DISABLE:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_ONU_READY:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_PORT_DISABLED:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_POWER:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_POWER_MON_RX_POWER_HIGH:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_POWER_MON_RX_POWER_LOW:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_POWER_MON_TEMP_HIGH:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_POWER_MON_TEMP_LOW:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_POWER_MON_TX_BIAS_HIGH:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_POWER_MON_TX_BIAS_LOW:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_POWER_MON_TX_POWER_HIGH:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_POWER_MON_TX_POWER_LOW:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_POWER_MON_VCC_HIGH:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_POWER_MON_VCC_LOW:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_PROT_SWITCH:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_QUEUE_OVERFLOW:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_REG:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_REPORT_FAIL:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_STANDBY_LOS:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_SYSTEM:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_TEMPERATURE:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_TRANSMIT_DEGRADE:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_TX_FAIL:
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_oam_tek_event_get_packed_length(bcmolt_epon_oam_oam_tek_event *this)
{
    uint32_t count = 9;
    switch (this->alarm_code)
    {
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_STAT_ALARM:
            {
                count += 2;
            }
            break;
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_GPIO_LINK_FAULT:
            {
                count += 16;
            }
            break;
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_GPIO_DYING_GASP:
            {
                count += 16;
            }
            break;
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_GPIO_CRITICAL_EVENT:
            {
                count += 16;
            }
            break;
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_GPIO_OTHER:
            {
                count += 16;
            }
            break;
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_AUTH_UNAVAIL:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_AUTO_NEG_FAILURE:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_BOOT_INVALID:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_CRITICAL_EVENT:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_CTC_ALARM:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_CTC_DISCOVER:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_DIAG_LOAD:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_DYING_GASP:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_FAN_FAULT:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_FLASH_BUSY:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_FLOW_CONTROL_TIMEOUT:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_GATE_TIMEOUT:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_IPN_LOS:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_KEY_EXCHANGE:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_LASER_ALWAYS_ON:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_LEARN_TABLE_OVERFLOW:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_LINK_FAULT:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_LINK_OAM_DISC_COMPLETE:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_LINK_REG_FAIL:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_LINK_REG_START:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_LINK_REG_SUCCESS:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_LOOPBACK:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_LOSS_OF_SIGNAL:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_OAM_TIMEOUT:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_ONU_PON_DISABLE:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_ONU_READY:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_PORT_DISABLED:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_POWER:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_POWER_MON_RX_POWER_HIGH:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_POWER_MON_RX_POWER_LOW:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_POWER_MON_TEMP_HIGH:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_POWER_MON_TEMP_LOW:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_POWER_MON_TX_BIAS_HIGH:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_POWER_MON_TX_BIAS_LOW:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_POWER_MON_TX_POWER_HIGH:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_POWER_MON_TX_POWER_LOW:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_POWER_MON_VCC_HIGH:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_POWER_MON_VCC_LOW:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_PROT_SWITCH:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_QUEUE_OVERFLOW:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_REG:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_REPORT_FAIL:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_STANDBY_LOS:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_SYSTEM:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_TEMPERATURE:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_TRANSMIT_DEGRADE:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_TX_FAIL:
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_tek_event_unpack(bcmolt_epon_oam_oam_tek_event *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_tek_alarm_code_unpack(&this->alarm_code, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_bool(buf, &this->raised))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->port))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->link))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &this->queue))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_tek_alarm_context_unpack(&this->alarm_context, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->alarm_code)
    {
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_STAT_ALARM:
            {
                if (!bcmolt_epon_oam_tek_leaf_attribute_unpack(&this->u.stat_alarm.stat_id, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_GPIO_LINK_FAULT:
            {
                if (!bcmolt_epon_oam_oam_tek_event_gpio_unpack(&this->u.gpio_link_fault.value, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_GPIO_DYING_GASP:
            {
                if (!bcmolt_epon_oam_oam_tek_event_gpio_unpack(&this->u.gpio_dying_gasp.value, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_GPIO_CRITICAL_EVENT:
            {
                if (!bcmolt_epon_oam_oam_tek_event_gpio_unpack(&this->u.gpio_critical_event.value, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_GPIO_OTHER:
            {
                if (!bcmolt_epon_oam_oam_tek_event_gpio_unpack(&this->u.gpio_other.value, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_AUTH_UNAVAIL:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_AUTO_NEG_FAILURE:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_BOOT_INVALID:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_CRITICAL_EVENT:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_CTC_ALARM:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_CTC_DISCOVER:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_DIAG_LOAD:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_DYING_GASP:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_FAN_FAULT:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_FLASH_BUSY:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_FLOW_CONTROL_TIMEOUT:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_GATE_TIMEOUT:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_IPN_LOS:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_KEY_EXCHANGE:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_LASER_ALWAYS_ON:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_LEARN_TABLE_OVERFLOW:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_LINK_FAULT:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_LINK_OAM_DISC_COMPLETE:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_LINK_REG_FAIL:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_LINK_REG_START:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_LINK_REG_SUCCESS:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_LOOPBACK:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_LOSS_OF_SIGNAL:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_OAM_TIMEOUT:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_ONU_PON_DISABLE:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_ONU_READY:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_PORT_DISABLED:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_POWER:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_POWER_MON_RX_POWER_HIGH:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_POWER_MON_RX_POWER_LOW:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_POWER_MON_TEMP_HIGH:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_POWER_MON_TEMP_LOW:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_POWER_MON_TX_BIAS_HIGH:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_POWER_MON_TX_BIAS_LOW:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_POWER_MON_TX_POWER_HIGH:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_POWER_MON_TX_POWER_LOW:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_POWER_MON_VCC_HIGH:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_POWER_MON_VCC_LOW:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_PROT_SWITCH:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_QUEUE_OVERFLOW:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_REG:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_REPORT_FAIL:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_STANDBY_LOS:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_SYSTEM:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_TEMPERATURE:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_TRANSMIT_DEGRADE:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_TX_FAIL:
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_oam_tek_event_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_tek_alarm_code alarm_code;
    if (!bcmolt_epon_oam_tek_alarm_code_unpack(&alarm_code, packed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 2))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 2))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 2))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    switch (alarm_code)
    {
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_STAT_ALARM:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_GPIO_LINK_FAULT:
            {
                if (!bcmolt_epon_oam_oam_tek_event_gpio_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_GPIO_DYING_GASP:
            {
                if (!bcmolt_epon_oam_oam_tek_event_gpio_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_GPIO_CRITICAL_EVENT:
            {
                if (!bcmolt_epon_oam_oam_tek_event_gpio_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_GPIO_OTHER:
            {
                if (!bcmolt_epon_oam_oam_tek_event_gpio_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_AUTH_UNAVAIL:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_AUTO_NEG_FAILURE:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_BOOT_INVALID:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_CRITICAL_EVENT:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_CTC_ALARM:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_CTC_DISCOVER:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_DIAG_LOAD:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_DYING_GASP:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_FAN_FAULT:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_FLASH_BUSY:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_FLOW_CONTROL_TIMEOUT:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_GATE_TIMEOUT:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_IPN_LOS:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_KEY_EXCHANGE:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_LASER_ALWAYS_ON:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_LEARN_TABLE_OVERFLOW:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_LINK_FAULT:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_LINK_OAM_DISC_COMPLETE:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_LINK_REG_FAIL:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_LINK_REG_START:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_LINK_REG_SUCCESS:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_LOOPBACK:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_LOSS_OF_SIGNAL:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_OAM_TIMEOUT:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_ONU_PON_DISABLE:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_ONU_READY:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_PORT_DISABLED:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_POWER:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_POWER_MON_RX_POWER_HIGH:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_POWER_MON_RX_POWER_LOW:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_POWER_MON_TEMP_HIGH:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_POWER_MON_TEMP_LOW:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_POWER_MON_TX_BIAS_HIGH:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_POWER_MON_TX_BIAS_LOW:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_POWER_MON_TX_POWER_HIGH:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_POWER_MON_TX_POWER_LOW:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_POWER_MON_VCC_HIGH:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_POWER_MON_VCC_LOW:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_PROT_SWITCH:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_QUEUE_OVERFLOW:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_REG:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_REPORT_FAIL:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_STANDBY_LOS:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_SYSTEM:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_TEMPERATURE:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_TRANSMIT_DEGRADE:
        case BCMOLT_EPON_OAM_TEK_ALARM_CODE_TX_FAIL:
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_std_mac_address_pack(bcmolt_epon_oam_std_mac_address *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_buf_write_mac_address(buf, this->address))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_std_mac_address_unpack(bcmolt_epon_oam_std_mac_address *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_buf_read_mac_address(buf, &this->address))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_std_mac_address_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 6);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_var_desc_attr_base_pack(bcmolt_epon_oam_tek_var_desc_attr_base *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_tek_leaf_attribute_pack(this->attribute, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->attribute)
    {
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_STAT_THRESHOLD:
            {
                if (!bcmolt_epon_oam_tek_leaf_attribute_pack(this->u.port_stat_threshold.stat, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LINK_STAT_THRESHOLD:
            {
                if (!bcmolt_epon_oam_tek_leaf_attribute_pack(this->u.link_stat_threshold.stat, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ALARM_THRESHOLD:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ARP_REPLICATE_DEST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_BCAST_RATE_LIMIT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_BYPASS_SOFT_LEARN:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_CHIP_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_CHIP_VERSION:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_CONTROL_PORT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_COS_TRANSLATION:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_CROSSBAR_CONFIG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_CTL_VLAN_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DN_FILTER_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DOWN_BURST_TOLL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DYN_LEARN_AGE_LIMIT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DYN_LEARN_TBL_SIZE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DYN_LEARNING_MODE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DYN_MAC_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EGRESS_SHAPING:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ENCRYPT_KEY_EXPIRY_TIME:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ENCRYPTION_KEY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ENCRYPTION_MODE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_DOWN_BIT_LOADING:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_SDM_AMPLITUDE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_SDM_PHASE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_SDM_QUANTIZER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UNUSED0:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UNUSED1:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UNUSED2:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UNUSED3:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UNUSED4:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UP_BIT_LOADING:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EXT_FIRMWARE_VERSION:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EXTENDED_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FAILSAFE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FEATURE_SET:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FEC_MODE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FILE_INFO:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FIRMWARE_TIMESTAMP:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FIRMWARE_VER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FLOOD_UNKNOWN:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_IGMP_FRAME_RATE_LIMIT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_INGRESS_POLICING:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_INTERNAL_VERSION:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_IPMC_UNKNOWN_LEAVE_FWD:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_JEDEC_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LACP_DEST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LEARN_MODE_RULE_UPDATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LEARN_TABLE_MODE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LEN_ERROR_DISCARD:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LINK_STATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LINK_STATS_THRESHOLD_INTERVAL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LOCAL_SWITCHING:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LUE_FIELD_SELECT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LUE_FIELD_SELECT_LIST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MCAST_DOMAIN_CONFIG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MCAST_GLOBAL_CONFIG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MCAST_GROUP_INFO:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MDI_CROSSOVER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MIN_MAC_LIMIT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MPCP_CLOCK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MPCP_CLOCK_COMPENSATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MTU:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_NETWORK_PON_MAP:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_NEW_DN_FILTER_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_NEW_UP_FILTER_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_NVS_SCRATCHPAD:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_NVS_STATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ONU_AGGREGATE_LIMIT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ONU_HOLDOVER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ONU_IGMP_VLAN:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ONU_RULE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POLICER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_CAPABILITY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_DYNAMIC_ENTRIES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_STATS_THRESHOLD_INTERVAL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_VLAN_MEMBERSHIP:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_VLAN_POLICY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POWER_MON_RX_POWER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POWER_MON_TEMPERATURE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POWER_MON_TX_BIAS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POWER_MON_TX_POWER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POWER_MON_VCC:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PRI_ENQUEUING:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PSSTATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_QUEUE_CONFIG_V2:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_QUEUEPRIMAP:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_REPORT_THRESHOLDS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_BYTES_DELAYED:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_BYTES_DROPPED:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_DELAY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_DELAY_THRESHOLD:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME_TOO_SHORT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME1024TO1518:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME128TO255:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME1519PLUS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME256TO511:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME512TO1023:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME64:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME65TO127:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAMES_DROPPED:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_UNICAST_FRAMES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_SEARCH_CONFIG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_SEQUENCE_NUMBER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_SLE_MODE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STATIC_MAC_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_AD_SELECT_ABLE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_AD_TECH:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_ADMIN_STATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_AUTO_CFG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_LOCAL_SELECT_ABLE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_LOCAL_TECH:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_REMOTE_SIG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_RX_SELECT_ABLE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_RX_TECH:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_FEC_ABILITY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_FEC_CORRECTED_BLOCKS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_FEC_MODE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_FEC_UNCORRECTABLE_BLOCKS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_ADDR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_ALIGN_ERR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_BCAST_FRAMES_RX_OK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_BCAST_FRAMES_TX_OK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CAPABILITIES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CARRIER_SENSE_ERR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_COLLISION_FRAMES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_FRAMES_RX:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_FRAMES_TX:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_FUNCS_SUPPORTED:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_PAUSE_DELAY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_PAUSE_RX:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_PAUSE_TX:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_UNSUPPORTED_OP_RX:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_DUPLEX_STATUS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_ENABLE_STATUS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_EXCESSIVE_COLLISIONS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FCS_ERR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FR_EXCESSIVE_DEFERRAL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAME_TOO_LONG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAMES_DEFERRED:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAMES_LOST_MAC_RX_ERR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAMES_LOST_MAC_TX_ERR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAMES_RX_OK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAMES_TX_OK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_IN_RANGE_LEN_ERR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_LATE_COLLISIONS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_MCAST_ADDR_LIST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_MCAST_FRAMES_RX_OK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_MCAST_FRAMES_TX_OK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_MCAST_RX_STATUS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_MULTIPLE_COLL_FRAMES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_OCTETS_RX_OK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_OCTETS_TX_OK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_OUT_OF_RANGE_LEN_ERR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_PROMISCUOUS_STATUS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_SINGLE_COLL_FRAMES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_TX_ENABLE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAU_MEDIA_AVAIL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_DISCOVERY_TIMEOUT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_DISCOVERY_WINDOW_TX:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_MAC_CTRL_FRAMES_RX:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_MAC_CTRL_FRAMES_TX:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_RX_GATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_RX_REG_ACK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_RX_REG_REQUEST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_RX_REGISTER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_RX_REPORT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_TX_GATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_TX_REG_ACK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_TX_REG_REQUEST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_TX_REGISTER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_TX_REPORT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_OAM_EMUL_CRC8ERR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_OAM_LOCAL_ERR_FRAME_SECS_EVENT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_PHY_ADMIN_STATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_PHY_SYMBOL_ERR_DURING_CARRIER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_PHY_TYPE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_PHY_TYPE_LIST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_SYSTEM_RULE_OPTIONS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TRANSCEIVER_BURST_ACTIVITY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TRANSCEIVER_SIGNAL_DETECT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_BYTES_DELAYED:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_BYTES_DROPPED:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_BYTES_UNUSED:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_DELAY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_DELAY_THRESHOLD:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME1024TO1518:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME128TO255:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME1519PLUS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME256TO511:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME512TO1023:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME64:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME65TO127:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAMES_DROPPED:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_UNICAST_FRAMES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_UNI_SHAPER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_UP_FILTER_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_VLAN_DESTINATIONS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_VLAN_ETHERTYPE:
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tek_var_desc_attr_base_get_packed_length(bcmolt_epon_oam_tek_var_desc_attr_base *this)
{
    uint32_t count = 2;
    switch (this->attribute)
    {
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_STAT_THRESHOLD:
            {
                count += 2;
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LINK_STAT_THRESHOLD:
            {
                count += 2;
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ALARM_THRESHOLD:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ARP_REPLICATE_DEST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_BCAST_RATE_LIMIT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_BYPASS_SOFT_LEARN:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_CHIP_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_CHIP_VERSION:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_CONTROL_PORT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_COS_TRANSLATION:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_CROSSBAR_CONFIG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_CTL_VLAN_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DN_FILTER_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DOWN_BURST_TOLL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DYN_LEARN_AGE_LIMIT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DYN_LEARN_TBL_SIZE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DYN_LEARNING_MODE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DYN_MAC_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EGRESS_SHAPING:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ENCRYPT_KEY_EXPIRY_TIME:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ENCRYPTION_KEY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ENCRYPTION_MODE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_DOWN_BIT_LOADING:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_SDM_AMPLITUDE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_SDM_PHASE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_SDM_QUANTIZER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UNUSED0:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UNUSED1:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UNUSED2:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UNUSED3:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UNUSED4:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UP_BIT_LOADING:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EXT_FIRMWARE_VERSION:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EXTENDED_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FAILSAFE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FEATURE_SET:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FEC_MODE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FILE_INFO:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FIRMWARE_TIMESTAMP:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FIRMWARE_VER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FLOOD_UNKNOWN:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_IGMP_FRAME_RATE_LIMIT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_INGRESS_POLICING:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_INTERNAL_VERSION:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_IPMC_UNKNOWN_LEAVE_FWD:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_JEDEC_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LACP_DEST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LEARN_MODE_RULE_UPDATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LEARN_TABLE_MODE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LEN_ERROR_DISCARD:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LINK_STATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LINK_STATS_THRESHOLD_INTERVAL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LOCAL_SWITCHING:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LUE_FIELD_SELECT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LUE_FIELD_SELECT_LIST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MCAST_DOMAIN_CONFIG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MCAST_GLOBAL_CONFIG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MCAST_GROUP_INFO:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MDI_CROSSOVER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MIN_MAC_LIMIT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MPCP_CLOCK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MPCP_CLOCK_COMPENSATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MTU:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_NETWORK_PON_MAP:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_NEW_DN_FILTER_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_NEW_UP_FILTER_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_NVS_SCRATCHPAD:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_NVS_STATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ONU_AGGREGATE_LIMIT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ONU_HOLDOVER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ONU_IGMP_VLAN:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ONU_RULE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POLICER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_CAPABILITY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_DYNAMIC_ENTRIES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_STATS_THRESHOLD_INTERVAL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_VLAN_MEMBERSHIP:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_VLAN_POLICY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POWER_MON_RX_POWER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POWER_MON_TEMPERATURE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POWER_MON_TX_BIAS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POWER_MON_TX_POWER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POWER_MON_VCC:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PRI_ENQUEUING:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PSSTATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_QUEUE_CONFIG_V2:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_QUEUEPRIMAP:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_REPORT_THRESHOLDS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_BYTES_DELAYED:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_BYTES_DROPPED:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_DELAY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_DELAY_THRESHOLD:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME_TOO_SHORT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME1024TO1518:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME128TO255:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME1519PLUS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME256TO511:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME512TO1023:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME64:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME65TO127:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAMES_DROPPED:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_UNICAST_FRAMES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_SEARCH_CONFIG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_SEQUENCE_NUMBER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_SLE_MODE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STATIC_MAC_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_AD_SELECT_ABLE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_AD_TECH:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_ADMIN_STATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_AUTO_CFG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_LOCAL_SELECT_ABLE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_LOCAL_TECH:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_REMOTE_SIG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_RX_SELECT_ABLE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_RX_TECH:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_FEC_ABILITY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_FEC_CORRECTED_BLOCKS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_FEC_MODE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_FEC_UNCORRECTABLE_BLOCKS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_ADDR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_ALIGN_ERR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_BCAST_FRAMES_RX_OK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_BCAST_FRAMES_TX_OK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CAPABILITIES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CARRIER_SENSE_ERR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_COLLISION_FRAMES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_FRAMES_RX:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_FRAMES_TX:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_FUNCS_SUPPORTED:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_PAUSE_DELAY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_PAUSE_RX:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_PAUSE_TX:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_UNSUPPORTED_OP_RX:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_DUPLEX_STATUS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_ENABLE_STATUS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_EXCESSIVE_COLLISIONS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FCS_ERR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FR_EXCESSIVE_DEFERRAL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAME_TOO_LONG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAMES_DEFERRED:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAMES_LOST_MAC_RX_ERR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAMES_LOST_MAC_TX_ERR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAMES_RX_OK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAMES_TX_OK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_IN_RANGE_LEN_ERR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_LATE_COLLISIONS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_MCAST_ADDR_LIST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_MCAST_FRAMES_RX_OK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_MCAST_FRAMES_TX_OK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_MCAST_RX_STATUS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_MULTIPLE_COLL_FRAMES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_OCTETS_RX_OK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_OCTETS_TX_OK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_OUT_OF_RANGE_LEN_ERR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_PROMISCUOUS_STATUS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_SINGLE_COLL_FRAMES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_TX_ENABLE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAU_MEDIA_AVAIL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_DISCOVERY_TIMEOUT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_DISCOVERY_WINDOW_TX:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_MAC_CTRL_FRAMES_RX:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_MAC_CTRL_FRAMES_TX:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_RX_GATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_RX_REG_ACK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_RX_REG_REQUEST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_RX_REGISTER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_RX_REPORT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_TX_GATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_TX_REG_ACK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_TX_REG_REQUEST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_TX_REGISTER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_TX_REPORT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_OAM_EMUL_CRC8ERR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_OAM_LOCAL_ERR_FRAME_SECS_EVENT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_PHY_ADMIN_STATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_PHY_SYMBOL_ERR_DURING_CARRIER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_PHY_TYPE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_PHY_TYPE_LIST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_SYSTEM_RULE_OPTIONS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TRANSCEIVER_BURST_ACTIVITY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TRANSCEIVER_SIGNAL_DETECT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_BYTES_DELAYED:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_BYTES_DROPPED:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_BYTES_UNUSED:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_DELAY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_DELAY_THRESHOLD:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME1024TO1518:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME128TO255:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME1519PLUS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME256TO511:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME512TO1023:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME64:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME65TO127:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAMES_DROPPED:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_UNICAST_FRAMES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_UNI_SHAPER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_UP_FILTER_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_VLAN_DESTINATIONS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_VLAN_ETHERTYPE:
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_var_desc_attr_base_unpack(bcmolt_epon_oam_tek_var_desc_attr_base *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_tek_leaf_attribute_unpack(&this->attribute, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->attribute)
    {
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_STAT_THRESHOLD:
            {
                if (!bcmolt_epon_oam_tek_leaf_attribute_unpack(&this->u.port_stat_threshold.stat, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LINK_STAT_THRESHOLD:
            {
                if (!bcmolt_epon_oam_tek_leaf_attribute_unpack(&this->u.link_stat_threshold.stat, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ALARM_THRESHOLD:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ARP_REPLICATE_DEST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_BCAST_RATE_LIMIT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_BYPASS_SOFT_LEARN:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_CHIP_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_CHIP_VERSION:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_CONTROL_PORT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_COS_TRANSLATION:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_CROSSBAR_CONFIG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_CTL_VLAN_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DN_FILTER_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DOWN_BURST_TOLL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DYN_LEARN_AGE_LIMIT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DYN_LEARN_TBL_SIZE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DYN_LEARNING_MODE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DYN_MAC_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EGRESS_SHAPING:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ENCRYPT_KEY_EXPIRY_TIME:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ENCRYPTION_KEY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ENCRYPTION_MODE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_DOWN_BIT_LOADING:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_SDM_AMPLITUDE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_SDM_PHASE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_SDM_QUANTIZER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UNUSED0:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UNUSED1:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UNUSED2:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UNUSED3:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UNUSED4:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UP_BIT_LOADING:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EXT_FIRMWARE_VERSION:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EXTENDED_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FAILSAFE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FEATURE_SET:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FEC_MODE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FILE_INFO:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FIRMWARE_TIMESTAMP:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FIRMWARE_VER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FLOOD_UNKNOWN:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_IGMP_FRAME_RATE_LIMIT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_INGRESS_POLICING:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_INTERNAL_VERSION:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_IPMC_UNKNOWN_LEAVE_FWD:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_JEDEC_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LACP_DEST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LEARN_MODE_RULE_UPDATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LEARN_TABLE_MODE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LEN_ERROR_DISCARD:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LINK_STATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LINK_STATS_THRESHOLD_INTERVAL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LOCAL_SWITCHING:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LUE_FIELD_SELECT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LUE_FIELD_SELECT_LIST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MCAST_DOMAIN_CONFIG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MCAST_GLOBAL_CONFIG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MCAST_GROUP_INFO:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MDI_CROSSOVER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MIN_MAC_LIMIT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MPCP_CLOCK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MPCP_CLOCK_COMPENSATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MTU:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_NETWORK_PON_MAP:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_NEW_DN_FILTER_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_NEW_UP_FILTER_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_NVS_SCRATCHPAD:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_NVS_STATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ONU_AGGREGATE_LIMIT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ONU_HOLDOVER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ONU_IGMP_VLAN:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ONU_RULE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POLICER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_CAPABILITY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_DYNAMIC_ENTRIES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_STATS_THRESHOLD_INTERVAL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_VLAN_MEMBERSHIP:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_VLAN_POLICY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POWER_MON_RX_POWER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POWER_MON_TEMPERATURE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POWER_MON_TX_BIAS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POWER_MON_TX_POWER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POWER_MON_VCC:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PRI_ENQUEUING:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PSSTATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_QUEUE_CONFIG_V2:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_QUEUEPRIMAP:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_REPORT_THRESHOLDS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_BYTES_DELAYED:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_BYTES_DROPPED:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_DELAY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_DELAY_THRESHOLD:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME_TOO_SHORT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME1024TO1518:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME128TO255:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME1519PLUS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME256TO511:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME512TO1023:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME64:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME65TO127:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAMES_DROPPED:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_UNICAST_FRAMES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_SEARCH_CONFIG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_SEQUENCE_NUMBER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_SLE_MODE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STATIC_MAC_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_AD_SELECT_ABLE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_AD_TECH:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_ADMIN_STATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_AUTO_CFG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_LOCAL_SELECT_ABLE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_LOCAL_TECH:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_REMOTE_SIG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_RX_SELECT_ABLE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_RX_TECH:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_FEC_ABILITY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_FEC_CORRECTED_BLOCKS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_FEC_MODE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_FEC_UNCORRECTABLE_BLOCKS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_ADDR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_ALIGN_ERR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_BCAST_FRAMES_RX_OK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_BCAST_FRAMES_TX_OK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CAPABILITIES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CARRIER_SENSE_ERR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_COLLISION_FRAMES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_FRAMES_RX:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_FRAMES_TX:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_FUNCS_SUPPORTED:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_PAUSE_DELAY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_PAUSE_RX:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_PAUSE_TX:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_UNSUPPORTED_OP_RX:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_DUPLEX_STATUS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_ENABLE_STATUS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_EXCESSIVE_COLLISIONS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FCS_ERR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FR_EXCESSIVE_DEFERRAL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAME_TOO_LONG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAMES_DEFERRED:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAMES_LOST_MAC_RX_ERR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAMES_LOST_MAC_TX_ERR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAMES_RX_OK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAMES_TX_OK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_IN_RANGE_LEN_ERR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_LATE_COLLISIONS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_MCAST_ADDR_LIST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_MCAST_FRAMES_RX_OK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_MCAST_FRAMES_TX_OK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_MCAST_RX_STATUS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_MULTIPLE_COLL_FRAMES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_OCTETS_RX_OK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_OCTETS_TX_OK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_OUT_OF_RANGE_LEN_ERR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_PROMISCUOUS_STATUS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_SINGLE_COLL_FRAMES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_TX_ENABLE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAU_MEDIA_AVAIL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_DISCOVERY_TIMEOUT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_DISCOVERY_WINDOW_TX:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_MAC_CTRL_FRAMES_RX:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_MAC_CTRL_FRAMES_TX:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_RX_GATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_RX_REG_ACK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_RX_REG_REQUEST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_RX_REGISTER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_RX_REPORT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_TX_GATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_TX_REG_ACK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_TX_REG_REQUEST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_TX_REGISTER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_TX_REPORT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_OAM_EMUL_CRC8ERR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_OAM_LOCAL_ERR_FRAME_SECS_EVENT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_PHY_ADMIN_STATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_PHY_SYMBOL_ERR_DURING_CARRIER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_PHY_TYPE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_PHY_TYPE_LIST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_SYSTEM_RULE_OPTIONS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TRANSCEIVER_BURST_ACTIVITY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TRANSCEIVER_SIGNAL_DETECT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_BYTES_DELAYED:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_BYTES_DROPPED:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_BYTES_UNUSED:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_DELAY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_DELAY_THRESHOLD:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME1024TO1518:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME128TO255:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME1519PLUS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME256TO511:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME512TO1023:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME64:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME65TO127:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAMES_DROPPED:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_UNICAST_FRAMES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_UNI_SHAPER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_UP_FILTER_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_VLAN_DESTINATIONS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_VLAN_ETHERTYPE:
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tek_var_desc_attr_base_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_tek_leaf_attribute attribute;
    if (!bcmolt_epon_oam_tek_leaf_attribute_unpack(&attribute, packed))
    {
        return BCMOS_FALSE;
    }

    switch (attribute)
    {
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_STAT_THRESHOLD:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LINK_STAT_THRESHOLD:
            {
                if (!bcmolt_epon_oam_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ALARM_THRESHOLD:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ARP_REPLICATE_DEST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_BCAST_RATE_LIMIT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_BYPASS_SOFT_LEARN:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_CHIP_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_CHIP_VERSION:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_CONTROL_PORT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_COS_TRANSLATION:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_CROSSBAR_CONFIG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_CTL_VLAN_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DN_FILTER_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DOWN_BURST_TOLL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DYN_LEARN_AGE_LIMIT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DYN_LEARN_TBL_SIZE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DYN_LEARNING_MODE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_DYN_MAC_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EGRESS_SHAPING:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ENCRYPT_KEY_EXPIRY_TIME:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ENCRYPTION_KEY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ENCRYPTION_MODE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_DOWN_BIT_LOADING:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_SDM_AMPLITUDE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_SDM_PHASE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_SDM_QUANTIZER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UNUSED0:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UNUSED1:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UNUSED2:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UNUSED3:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UNUSED4:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EPOC_UP_BIT_LOADING:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EXT_FIRMWARE_VERSION:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_EXTENDED_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FAILSAFE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FEATURE_SET:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FEC_MODE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FILE_INFO:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FIRMWARE_TIMESTAMP:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FIRMWARE_VER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_FLOOD_UNKNOWN:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_IGMP_FRAME_RATE_LIMIT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_INGRESS_POLICING:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_INTERNAL_VERSION:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_IPMC_UNKNOWN_LEAVE_FWD:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_JEDEC_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LACP_DEST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LEARN_MODE_RULE_UPDATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LEARN_TABLE_MODE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LEN_ERROR_DISCARD:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LINK_STATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LINK_STATS_THRESHOLD_INTERVAL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LOCAL_SWITCHING:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LUE_FIELD_SELECT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_LUE_FIELD_SELECT_LIST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MCAST_DOMAIN_CONFIG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MCAST_GLOBAL_CONFIG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MCAST_GROUP_INFO:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MDI_CROSSOVER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MIN_MAC_LIMIT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MPCP_CLOCK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MPCP_CLOCK_COMPENSATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_MTU:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_NETWORK_PON_MAP:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_NEW_DN_FILTER_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_NEW_UP_FILTER_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_NVS_SCRATCHPAD:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_NVS_STATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ONU_AGGREGATE_LIMIT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ONU_HOLDOVER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ONU_IGMP_VLAN:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_ONU_RULE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POLICER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_CAPABILITY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_DYNAMIC_ENTRIES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_STATS_THRESHOLD_INTERVAL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_VLAN_MEMBERSHIP:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PORT_VLAN_POLICY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POWER_MON_RX_POWER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POWER_MON_TEMPERATURE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POWER_MON_TX_BIAS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POWER_MON_TX_POWER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_POWER_MON_VCC:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PRI_ENQUEUING:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_PSSTATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_QUEUE_CONFIG_V2:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_QUEUEPRIMAP:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_REPORT_THRESHOLDS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_BYTES_DELAYED:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_BYTES_DROPPED:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_DELAY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_DELAY_THRESHOLD:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME_TOO_SHORT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME1024TO1518:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME128TO255:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME1519PLUS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME256TO511:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME512TO1023:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME64:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAME65TO127:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_FRAMES_DROPPED:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_RX_UNICAST_FRAMES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_SEARCH_CONFIG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_SEQUENCE_NUMBER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_SLE_MODE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STATIC_MAC_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_AD_SELECT_ABLE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_AD_TECH:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_ADMIN_STATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_AUTO_CFG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_LOCAL_SELECT_ABLE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_LOCAL_TECH:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_REMOTE_SIG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_RX_SELECT_ABLE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_AUTO_NEG_RX_TECH:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_FEC_ABILITY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_FEC_CORRECTED_BLOCKS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_FEC_MODE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_FEC_UNCORRECTABLE_BLOCKS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_ADDR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_ALIGN_ERR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_BCAST_FRAMES_RX_OK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_BCAST_FRAMES_TX_OK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CAPABILITIES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CARRIER_SENSE_ERR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_COLLISION_FRAMES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_FRAMES_RX:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_FRAMES_TX:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_FUNCS_SUPPORTED:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_PAUSE_DELAY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_PAUSE_RX:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_PAUSE_TX:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_CTRL_UNSUPPORTED_OP_RX:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_DUPLEX_STATUS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_ENABLE_STATUS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_EXCESSIVE_COLLISIONS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FCS_ERR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FR_EXCESSIVE_DEFERRAL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAME_TOO_LONG:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAMES_DEFERRED:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAMES_LOST_MAC_RX_ERR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAMES_LOST_MAC_TX_ERR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAMES_RX_OK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_FRAMES_TX_OK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_ID:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_IN_RANGE_LEN_ERR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_LATE_COLLISIONS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_MCAST_ADDR_LIST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_MCAST_FRAMES_RX_OK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_MCAST_FRAMES_TX_OK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_MCAST_RX_STATUS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_MULTIPLE_COLL_FRAMES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_OCTETS_RX_OK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_OCTETS_TX_OK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_OUT_OF_RANGE_LEN_ERR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_PROMISCUOUS_STATUS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_SINGLE_COLL_FRAMES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAC_TX_ENABLE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MAU_MEDIA_AVAIL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_DISCOVERY_TIMEOUT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_DISCOVERY_WINDOW_TX:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_MAC_CTRL_FRAMES_RX:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_MAC_CTRL_FRAMES_TX:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_RX_GATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_RX_REG_ACK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_RX_REG_REQUEST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_RX_REGISTER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_RX_REPORT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_TX_GATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_TX_REG_ACK:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_TX_REG_REQUEST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_TX_REGISTER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_MPCP_TX_REPORT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_OAM_EMUL_CRC8ERR:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_OAM_LOCAL_ERR_FRAME_SECS_EVENT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_PHY_ADMIN_STATE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_PHY_SYMBOL_ERR_DURING_CARRIER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_PHY_TYPE:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_STD_PHY_TYPE_LIST:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_SYSTEM_RULE_OPTIONS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TRANSCEIVER_BURST_ACTIVITY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TRANSCEIVER_SIGNAL_DETECT:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_BYTES_DELAYED:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_BYTES_DROPPED:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_BYTES_UNUSED:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_DELAY:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_DELAY_THRESHOLD:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME1024TO1518:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME128TO255:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME1519PLUS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME256TO511:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME512TO1023:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME64:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAME65TO127:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_FRAMES_DROPPED:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_TX_UNICAST_FRAMES:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_UNI_SHAPER:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_UP_FILTER_TBL:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_VLAN_DESTINATIONS:
        case BCMOLT_EPON_OAM_TEK_LEAF_ATTRIBUTE_VLAN_ETHERTYPE:
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_record_continued_pack(bcmolt_epon_oam_tls_record_continued *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t preLenFieldPos;
    uint32_t bytesAfterLenField;
    if (!bcmolt_epon_oam_tls_content_type_pack(this->content_type, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_tls_version_pack(&this->version, buf))
    {
        return BCMOS_FALSE;
    }

    preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

    /* skip over length field (we'll fill it in later) */
    if (!bcmolt_epon_oam_buf_skip(buf, 2))
    {
        return BCMOS_FALSE;
    }

    switch (this->content_type)
    {
        case BCMOLT_EPON_OAM_TLS_CONTENT_TYPE_ALERT:
        case BCMOLT_EPON_OAM_TLS_CONTENT_TYPE_APPLICATION_DATA:
        case BCMOLT_EPON_OAM_TLS_CONTENT_TYPE_CHANGE_CIPHER_SPEC:
        case BCMOLT_EPON_OAM_TLS_CONTENT_TYPE_HANDSHAKE:
        default:
            {
                if ((this->u.def.data_count > 0) && (this->u.def.data == NULL))
                {
                    bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"data\" of struct \"bcmolt_epon_oam_tls_record_continued_def\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                    return BCMOS_FALSE;
                }

                if (!bcmolt_epon_oam_buf_write(buf, this->u.def.data, this->u.def.data_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint16_t));
    if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, bytesAfterLenField))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint16_t))))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tls_record_continued_get_packed_length(bcmolt_epon_oam_tls_record_continued *this)
{
    uint32_t count = 5;
    switch (this->content_type)
    {
        case BCMOLT_EPON_OAM_TLS_CONTENT_TYPE_ALERT:
        case BCMOLT_EPON_OAM_TLS_CONTENT_TYPE_APPLICATION_DATA:
        case BCMOLT_EPON_OAM_TLS_CONTENT_TYPE_CHANGE_CIPHER_SPEC:
        case BCMOLT_EPON_OAM_TLS_CONTENT_TYPE_HANDSHAKE:
        default:
            {
                count += this->u.def.data_count;
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_record_continued_unpack(bcmolt_epon_oam_tls_record_continued *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint16_t length = 0;
    bcmolt_epon_oam_buf postLenBuf;
    if (!bcmolt_epon_oam_tls_content_type_unpack(&this->content_type, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_tls_version_unpack(&this->version, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(buf, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, buf->curr);
    switch (this->content_type)
    {
        case BCMOLT_EPON_OAM_TLS_CONTENT_TYPE_ALERT:
        case BCMOLT_EPON_OAM_TLS_CONTENT_TYPE_APPLICATION_DATA:
        case BCMOLT_EPON_OAM_TLS_CONTENT_TYPE_CHANGE_CIPHER_SPEC:
        case BCMOLT_EPON_OAM_TLS_CONTENT_TYPE_HANDSHAKE:
        default:
            {
                this->u.def.data_count = bcmolt_epon_oam_tls_record_continued_def_count_data(&postLenBuf);
                if ((this->u.def.data_count > 0) && (this->u.def.data == NULL))
                {
                    if (extra_mem == NULL)
                    {
                        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"data\" of struct \"bcmolt_epon_oam_tls_record_continued_def\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
                        return BCMOS_FALSE;
                    }
                    else
                    {
                        this->u.def.data = (uint8_t *) *extra_mem;
                        *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->u.def.data_count * sizeof(uint8_t));
                    }
                }

                if (!bcmolt_epon_oam_buf_read(&postLenBuf, this->u.def.data, this->u.def.data_count))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(buf, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_record_continued_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_tls_content_type content_type;
    bcmolt_epon_oam_buf postLenBuf;
    uint16_t length;
    if (!bcmolt_epon_oam_tls_content_type_unpack(&content_type, packed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, 2))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_read_u16(packed, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, packed->curr);
    switch (content_type)
    {
        case BCMOLT_EPON_OAM_TLS_CONTENT_TYPE_ALERT:
        case BCMOLT_EPON_OAM_TLS_CONTENT_TYPE_APPLICATION_DATA:
        case BCMOLT_EPON_OAM_TLS_CONTENT_TYPE_CHANGE_CIPHER_SPEC:
        case BCMOLT_EPON_OAM_TLS_CONTENT_TYPE_HANDSHAKE:
        default:
            {
                uint32_t data_elem_count = 0;
                while (BCMOS_TRUE)
                {
                    if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 1))
                    {
                        break;
                    }

                    data_elem_count += 1;
                }

                *extra_mem += BCMOS_ROUND_TO_WORD(data_elem_count * sizeof(uint8_t));
            }
            break;
    }

    if (!bcmolt_epon_oam_buf_skip(packed, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tls_record_continued_def_count_data(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 1);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_signature_and_hash_algorithm_pack(bcmolt_epon_oam_tls_signature_and_hash_algorithm *this, bcmolt_epon_oam_buf *buf)
{
    if (!bcmolt_epon_oam_tls_hash_algorithm_pack(this->hash, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_tls_signature_algorithm_pack(this->signature, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_signature_and_hash_algorithm_unpack(bcmolt_epon_oam_tls_signature_and_hash_algorithm *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_tls_hash_algorithm_unpack(&this->hash, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_tls_signature_algorithm_unpack(&this->signature, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_signature_and_hash_algorithm_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_epon_oam_buf_skip(packed, 2);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_signature_and_hash_algorithm_list_pack(bcmolt_epon_oam_tls_signature_and_hash_algorithm_list *this, bcmolt_epon_oam_buf *buf)
{
    uint32_t preLenFieldPos;
    uint32_t bytesAfterLenField;
    uint32_t i0;
    preLenFieldPos = bcmolt_epon_oam_buf_get_used(buf);

    /* skip over length field (we'll fill it in later) */
    if (!bcmolt_epon_oam_buf_skip(buf, 2))
    {
        return BCMOS_FALSE;
    }

    if ((this->supported_signature_algorithms_count > 0) && (this->supported_signature_algorithms == NULL))
    {
        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"supported_signature_algorithms\" of struct \"bcmolt_epon_oam_tls_signature_and_hash_algorithm_list\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    if (this->supported_signature_algorithms_count > 65534L)
    {
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->supported_signature_algorithms_count; i0++)
    {
        if (!bcmolt_epon_oam_tls_signature_and_hash_algorithm_pack(&this->supported_signature_algorithms[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    bytesAfterLenField = bcmolt_epon_oam_buf_get_used(buf) - (preLenFieldPos + sizeof(uint16_t));
    if (!bcmolt_epon_oam_buf_set_pos(buf, preLenFieldPos))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_write_u16(buf, bytesAfterLenField))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_oam_buf_set_pos(buf, bytesAfterLenField + (preLenFieldPos + sizeof(uint16_t))))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tls_signature_and_hash_algorithm_list_get_packed_length(bcmolt_epon_oam_tls_signature_and_hash_algorithm_list *this)
{
    return 2 + (2 * this->supported_signature_algorithms_count);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_signature_and_hash_algorithm_list_unpack(bcmolt_epon_oam_tls_signature_and_hash_algorithm_list *this, bcmolt_epon_oam_buf *buf, void **extra_mem)
{
    uint16_t length = 0;
    bcmolt_epon_oam_buf postLenBuf;
    uint32_t i0;
    if (!bcmolt_epon_oam_buf_read_u16(buf, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, buf->curr);
    this->supported_signature_algorithms_count = bcmolt_epon_oam_tls_signature_and_hash_algorithm_list_count_supported_signature_algorithms(&postLenBuf);
    if ((this->supported_signature_algorithms_count > 0) && (this->supported_signature_algorithms == NULL))
    {
        if (extra_mem == NULL)
        {
            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error: list field \"supported_signature_algorithms\" of struct \"bcmolt_epon_oam_tls_signature_and_hash_algorithm_list\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->supported_signature_algorithms = (bcmolt_epon_oam_tls_signature_and_hash_algorithm *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->supported_signature_algorithms_count * sizeof(bcmolt_epon_oam_tls_signature_and_hash_algorithm));
        }
    }

    if (this->supported_signature_algorithms_count > 65534L)
    {
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->supported_signature_algorithms_count; i0++)
    {
        if (!bcmolt_epon_oam_tls_signature_and_hash_algorithm_unpack(&this->supported_signature_algorithms[i0], &postLenBuf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if (!bcmolt_epon_oam_buf_skip(buf, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_tls_signature_and_hash_algorithm_list_scan(bcmolt_epon_oam_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_buf postLenBuf;
    uint16_t length;
    uint32_t supported_signature_algorithms_elem_count = 0;
    if (!bcmolt_epon_oam_buf_read_u16(packed, &length))
    {
        return BCMOS_FALSE;
    }

    bcmolt_epon_oam_buf_init(&postLenBuf, length, packed->curr);
    while (BCMOS_TRUE)
    {
        if (!bcmolt_epon_oam_buf_skip(&postLenBuf, 2))
        {
            break;
        }

        supported_signature_algorithms_elem_count += 1;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(supported_signature_algorithms_elem_count * sizeof(bcmolt_epon_oam_tls_signature_and_hash_algorithm));
    if (!bcmolt_epon_oam_buf_skip(packed, length))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_oam_tls_signature_and_hash_algorithm_list_count_supported_signature_algorithms(bcmolt_epon_oam_buf *buf)
{
    return (bcmolt_epon_oam_buf_get_remaining_size(buf) / 2);
}
